Skip to content

declarative macro compilation fails with serde derive #42708

Closed
@milyin

Description

@milyin

Declarative macro with '#[derive(Serialize)]' inside generates compilation error. The same old-style macro works ok.

I tried this code:

`#![feature(decl_macro)]
extern crate serde;
#[macro_use] extern crate serde_derive;

macro_rules! old_macro { 
    ($name:ident) => {
        #[derive(Serialize)]
        struct $name {
            name: &'static str
        }
    }
}

macro new_macro($name:ident) {
    #[derive(Serialize)]
    struct $name {
        name: &'static str
    }
}

old_macro!(Name1);
new_macro!(Name2);

fn main() {
}

'old_macro' and 'new_marcro' are equal so I expect that both should be compiled. Instead compiler failed on 'new_macro' (but compiled 'old_macro' successfully):

error[E0609]: no field `name` on type `&Name2`
  --> src\main.rs:15:14
   |
15 |     #[derive(Serialize)]
   |              ^^^^^^^^^
...
22 | new_macro!(Name2);
   | ------------------ in this macro invocation

Meta

C:\Temp\bug>rustc --version
rustc 1.19.0-nightly (554c685b0 2017-06-14)

C:\Temp\bug>cargo rustc --verbose
       Fresh serde v1.0.8
       Fresh unicode-xid v0.0.4
       Fresh quote v0.3.15
       Fresh synom v0.11.3
       Fresh syn v0.11.11
       Fresh serde_derive_internals v0.15.1
       Fresh serde_derive v1.0.8
   Compiling bug v0.1.0 (file:///C:/Temp/bug)
     Running `rustc --crate-name bug src\main.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=1ffe308d662129d2 -C extra-filename=-1ffe308d66
2129d2 --out-dir C:\Temp\bug\target\debug\deps -L dependency=C:\Temp\bug\target\debug\deps --extern serde_derive=C:\Temp\bug\target\debug\deps\serde_derive-7311
4808ba8f6d5d.dll --extern serde=C:\Temp\bug\target\debug\deps\libserde-78efb8229e554e58.rlib`
error[E0609]: no field `name` on type `&Name2`
  --> src\main.rs:15:14
   |
15 |     #[derive(Serialize)]
   |              ^^^^^^^^^
...
22 | new_macro!(Name2);
   | ------------------ in this macro invocation

error: aborting due to previous error(s)

error: Could not compile `bug`.

Caused by:
  process didn't exit successfully: `rustc --crate-name bug src\main.rs --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=1ffe308d662129d2 -C ext
ra-filename=-1ffe308d662129d2 --out-dir C:\Temp\bug\target\debug\deps -L dependency=C:\Temp\bug\target\debug\deps --extern serde_derive=C:\Temp\bug\target\debug
\deps\serde_derive-73114808ba8f6d5d.dll --extern serde=C:\Temp\bug\target\debug\deps\libserde-78efb8229e554e58.rlib` (exit code: 101)

Metadata

Metadata

Assignees

Labels

A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-bugCategory: This is a bug.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions