aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2023-06-01 16:23:27 +0200
committerCohenArthur <arthur.cohen@embecosm.com>2023-06-05 13:23:05 +0000
commitcc09d0bf04fd87afb9f2b717d485a380a05e0a73 (patch)
treea01ce052ccaf265d49b1eb3ecd74441eca79d485 /gcc
parent171ea4e2b3e202067c50f9c206974fbe1da691c0 (diff)
downloadgcc-cc09d0bf04fd87afb9f2b717d485a380a05e0a73.zip
gcc-cc09d0bf04fd87afb9f2b717d485a380a05e0a73.tar.gz
gcc-cc09d0bf04fd87afb9f2b717d485a380a05e0a73.tar.bz2
derive: Add dummy builtin transcriber for builtin derive macros.
Fixes #2257. 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. gcc/rust/ChangeLog: * expand/rust-macro-builtins.cc (MacroBuiltin::dummy): New function. * expand/rust-macro-builtins.h: Declare it. gcc/testsuite/ChangeLog: * rust/compile/derive_macro7.rs: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/expand/rust-macro-builtins.cc23
-rw-r--r--gcc/rust/expand/rust-macro-builtins.h4
-rw-r--r--gcc/testsuite/rust/compile/derive_macro7.rs8
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