I have a compile error involving a macro:
<mdo macros>:6:19: 6:50 error: cannot move out of captured outer variable in an `FnMut` closure
<mdo macros>:6 bind ( $ e , move | $ p | mdo ! { $ ( $ t ) * } ) ) ; (
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<mdo macros>:1:1: 14:36 note: in expansion of mdo!
<mdo macros>:6:27: 6:50 note: expansion site
<mdo macros>:1:1: 14:36 note: in expansion of mdo!
<mdo macros>:6:27: 6:50 note: expansion site
<mdo macros>:1:1: 14:36 note: in expansion of mdo!
src/parser.rs:30:42: 37:11 note: expansion site
error: aborting due to previous error
Unfortunately, the macro is recursive so it's hard to figure out what the compiler is complaining about, plus it seems like the line numbers are for the expanded macro rather than my code.
How can I see the expanded macro? Is there a flag I can pass to rustc (or even better, cargo) to dump this out?
(This macro is from rust-mdo, though I don't think it matters.)
Yes, you can pass a special flag to rustc
, called --pretty=expanded
:
% cat test.rs
fn main() {
println!("Hello world");
}
% rustc -Z unstable-options --pretty=expanded test.rs
#![feature(no_std)]
#![no_std]
#[prelude_import]
use std::prelude::v1::*;
#[macro_use]
extern crate "std" as std;
fn main() {
::std::old_io::stdio::println_args(::std::fmt::Arguments::new_v1({
static __STATIC_FMTSTR:
&'static [&'static str]
=
&["Hello world"];
__STATIC_FMTSTR
},
&match ()
{
()
=>
[],
}));
}
You need to allow it first, however, by passing -Z unstable-options
.
Since Rust 1.1 you can pass these arguments to Cargo, like this:
cargo rustc -- -Z unstable-options --pretty=expanded
A more concise alternative to cargo rustc -- -Zunstable-options --pretty=expanded
is the cargo-expand crate. It provides a Cargo subcommand cargo expand
which prints the result of macro expansion. It also passes the expanded code through rustfmt
which generally results in much more readable code than the default output from rustc.
Install by running cargo install cargo-expand
.