]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: derive: Add dummy builtin transcriber for builtin derive macros.
authorArthur Cohen <arthur.cohen@embecosm.com>
Thu, 1 Jun 2023 14:23:27 +0000 (16:23 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:46:24 +0000 (18:46 +0100)
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.

gcc/rust/expand/rust-macro-builtins.cc
gcc/rust/expand/rust-macro-builtins.h
gcc/testsuite/rust/compile/derive_macro7.rs [new file with mode: 0644]

index f4577503c25edca15f50d1d985aba03f52e12361..33b813c45940ed38efcf1e9832fbff7b3363f9fd 100644 (file)
@@ -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
index 0d8c4dba2dc164ac8f4b1fc6bdb4075a88945433..3ad10a33920e18f6adc6d952f91c99332482018e 100644 (file)
@@ -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 (file)
index 0000000..108e3cf
--- /dev/null
@@ -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