E0507 suggestion for borrowing mistake inside of a macro suggests a syntax error · Issue #107976 · rust-lang/rust (original) (raw)

Code

here's a minimal case -- a bit nonsensical but pulled out of a larger example

Cargo.toml

[package] name = "wat" version = "0.1.0" edition = "2021"

See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies] wat-derive = { path = "wat-derive" }

src/main.rs

use wat_derive::Example;

trait Example { fn f(&self); }

#[derive(Example)] struct S { x: Option }

fn main() { let s = S { x: None }; s.f(); }

wat-derive/Cargo.toml

[package] name = "wat-derive" version = "0.1.0" edition = "2021"

See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies] quote = "1.0.23" syn = "1.0.107"

[lib] proc-macro = true

wat-derive/src/lib.rs

#[proc_macro_derive(Example)] pub fn m(_input: proc_macro::TokenStream) -> proc_macro::TokenStream { quote::quote! { impl Example for S { fn f(&self) { // borrowing mistake here if let Some(v) = self.x { dbg!(v); } } } }.into() }

Current output

$ cargo build Compiling wat v0.1.0 (/home/asottile/workspace/pre-commit-rs/y/wat) error[E0507]: cannot move out of self.x as enum variant Some which is behind a shared reference --> src/main.rs:7:10 | 7 | #[derive(Example)] | ^^^^^^^ | | | data moved here | move occurs because v has type String, which does not implement the Copy trait | = note: this error originates in the derive macro Example (in Nightly builds, run with -Z macro-backtrace for more info) help: consider borrowing here | 7 | #[derive(&Example)] | +

For more information about this error, try rustc --explain E0507. error: could not compile wat due to previous error

Desired output

anything else tbh -- I don't really know the correct thing to do here -- it would be nice if it pointed at the borrow error inside the macro-generated code, but I don't think rustc currently displays the generated code anywhere

Rationale and extra context

No response

Other cases

No response

Anything else?

No response