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