Jmb
Jmb

Reputation: 23339

Unused variable in macro-generated code

I have written a macro that implements Scala-like for comprehensions in Rust. It will turn this:

map_for!{
    x <- 0..4;
    y = 2*x;
    z <- 0..1;
    => y+z
}

into this:

((0..4).map (move |x| { let y = 2 * x; (x, y) }))
    .flat_map (move |params| {
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })

This works, but the compiler emits an "unused variable" warning because x is not used inside the flat_map. I can disable the warning by adding #[allow(unused_variables)] before the let statements in the macro, but then it removes all unused variable warnings so this:

map_for!{
    x <- 0..4;
    y = 2;
    z <- 0..1;
    => y+z
}

will expand into:

((0..4).map (move |x| { let y = 2; (x, y) }))
    .flat_map (move |params| {
        #[allow(unused_variables)]
        let (x, y) = params;
        (0..1).map (move |z| { y + z })
    })

and will not generate a warning either even though x really is not used.

Is there a way to make it so that the first example will not generate a warning, but the second one will?

The full code of the macro with warnings is available, as is the full code with warnings suppressed.

Upvotes: 5

Views: 1190

Answers (1)

DK.
DK.

Reputation: 59065

The simplest way I can think of is to ensure x is being used, by using some inert operation. For example, you can use drop(&x); or perhaps {let _ = &x;}. Neither of these should have any effect on the surrounding code, since they both create, and then immediately relinquish, a borrow.

Upvotes: 2

Related Questions