diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.cc | 23 | ||||
-rw-r--r-- | gcc/rust/expand/rust-macro-builtins.h | 4 | ||||
-rw-r--r-- | gcc/testsuite/rust/compile/derive_macro7.rs | 8 |
3 files changed, 35 insertions, 0 deletions
diff --git a/gcc/rust/expand/rust-macro-builtins.cc b/gcc/rust/expand/rust-macro-builtins.cc index 8104c57..a4e9854 100644 --- a/gcc/rust/expand/rust-macro-builtins.cc +++ b/gcc/rust/expand/rust-macro-builtins.cc @@ -105,6 +105,22 @@ std::unordered_map< {"test_case", MacroBuiltin::sorry}, {"global_allocator", MacroBuiltin::sorry}, {"cfg_accessible", MacroBuiltin::sorry}, + /* Derive builtins do not need a real transcriber, but still need one. It + will however never be called since builtin derive macros get expanded + differently, and benefit from knowing on what kind of items they are + applied (struct, enums, unions) rather than receiving a list of tokens + like regular builtin macros */ + {"RustcEncodable", MacroBuiltin::proc_macro_builtin}, + {"RustcDecodable", MacroBuiltin::proc_macro_builtin}, + {"Clone", MacroBuiltin::proc_macro_builtin}, + {"Copy", MacroBuiltin::proc_macro_builtin}, + {"Debug", MacroBuiltin::proc_macro_builtin}, + {"Default", MacroBuiltin::proc_macro_builtin}, + {"Eq", MacroBuiltin::proc_macro_builtin}, + {"PartialEq", MacroBuiltin::proc_macro_builtin}, + {"Ord", MacroBuiltin::proc_macro_builtin}, + {"PartialOrd", MacroBuiltin::proc_macro_builtin}, + {"Hash", MacroBuiltin::proc_macro_builtin}, }; // FIXME: This should return an Optional @@ -932,4 +948,11 @@ MacroBuiltin::sorry (Location invoc_locus, AST::MacroInvocData &invoc) return AST::Fragment::create_error (); } +AST::Fragment +MacroBuiltin::proc_macro_builtin (Location, AST::MacroInvocData &) +{ + // nothing to do! + return AST::Fragment::create_error (); +} + } // namespace Rust diff --git a/gcc/rust/expand/rust-macro-builtins.h b/gcc/rust/expand/rust-macro-builtins.h index cf70e49..3759f62 100644 --- a/gcc/rust/expand/rust-macro-builtins.h +++ b/gcc/rust/expand/rust-macro-builtins.h @@ -159,6 +159,10 @@ public: AST::MacroInvocData &invoc); static AST::Fragment sorry (Location invoc_locus, AST::MacroInvocData &invoc); + + /* Builtin procedural macros do not work directly on tokens, but still need an + * empty builtin transcriber to be considered proper builtin macros */ + static AST::Fragment proc_macro_builtin (Location, AST::MacroInvocData &); }; } // namespace Rust diff --git a/gcc/testsuite/rust/compile/derive_macro7.rs b/gcc/testsuite/rust/compile/derive_macro7.rs new file mode 100644 index 0000000..108e3cf --- /dev/null +++ b/gcc/testsuite/rust/compile/derive_macro7.rs @@ -0,0 +1,8 @@ +#![feature(rustc_attrs)] + +#[rustc_builtin_macro] +#[stable(feature = "rust1", since = "1.0.0")] +#[allow_internal_unstable(core_intrinsics, libstd_sys_internals)] +pub macro RustcDecodable($item:item) { + /* compiler built-in */ +}
\ No newline at end of file |