https://gcc.gnu.org/g:24ccf53df2ad1ddecca250692303be4b2ae35dbd

commit r17-3134-g24ccf53df2ad1ddecca250692303be4b2ae35dbd
Author: Yap Zhi Heng <[email protected]>
Date:   Mon Jul 27 20:47:41 2026 +0800

    gccrs: Gate `cfg_select!` macro behind `-frust-compat-version=1.90`
    
    gcc/rust/ChangeLog:
    
            * expand/rust-macro-builtins.cc: Made it more explicit that 
cfg_select! is
            backported.
            * rust-session-manager.h (Session::should_support_cfg_select): New 
function to
            check whether cfg_select! should be compiled.
            * resolve/rust-early-name-resolver-2.0.cc 
(Early::visit(MacroInvocation)):
            Conditionally resolve cfg_select!.
            * expand/rust-macro-expand.cc (MacroExpander::expand_invoc): Ditto.
    
    gcc/testsuite/ChangeLog:
    
            * rust/execute/torture/cfg_select1.rs: Add new 
dg-additional-options, remove
            the no-longer-needed cfg_select! declaration.
            * rust/execute/torture/cfg_select2.rs: Ditto.
            * rust/compile/c_string_null_byte_check.rs: Ditto.
            * rust/execute/torture/c_string.rs: Ditto.
            * rust/execute/torture/c_string_ensure_null_term.rs: Ditto.
    
    Signed-off-by: Yap Zhi Heng <[email protected]>

Diff:
---
 gcc/rust/expand/rust-macro-builtins.cc                 |  3 ++-
 gcc/rust/expand/rust-macro-expand.cc                   | 18 ++++++++++++++++++
 gcc/rust/resolve/rust-early-name-resolver-2.0.cc       |  9 +++++++--
 gcc/rust/rust-session-manager.h                        |  5 +++++
 gcc/testsuite/rust/compile/c_string_null_byte_check.rs |  9 ++-------
 gcc/testsuite/rust/execute/torture/c_string.rs         |  9 ++-------
 .../rust/execute/torture/c_string_ensure_null_term.rs  |  9 ++-------
 gcc/testsuite/rust/execute/torture/cfg_select1.rs      | 11 +++--------
 gcc/testsuite/rust/execute/torture/cfg_select2.rs      | 11 +++--------
 9 files changed, 44 insertions(+), 40 deletions(-)

diff --git a/gcc/rust/expand/rust-macro-builtins.cc 
b/gcc/rust/expand/rust-macro-builtins.cc
index df651fd9bbcc..d96b23f99924 100644
--- a/gcc/rust/expand/rust-macro-builtins.cc
+++ b/gcc/rust/expand/rust-macro-builtins.cc
@@ -125,7 +125,6 @@ std::unordered_map<std::string, AST::MacroTranscriberFunc>
     {"concat", MacroBuiltin::concat_handler},
     {"env", MacroBuiltin::env_handler},
     {"cfg", MacroBuiltin::cfg_handler},
-    {"cfg_select", MacroBuiltin::cfg_select_handler},
     {"include", MacroBuiltin::include_handler},
     {"format_args", format_args_maker (AST::FormatArgs::Newline::No)},
     {"format_args_nl", format_args_maker (AST::FormatArgs::Newline::Yes)},
@@ -166,6 +165,8 @@ std::unordered_map<std::string, AST::MacroTranscriberFunc>
     /* offset_of is not declared in Rust 1.49 but still needed for
        Rust-for-Linux, so we still create a transcriber and warn the user */
     {"offset_of", MacroBuiltin::offset_of_handler},
+    /* cfg_select! is also not declared in Rust 1.49 but also needed for RfL */
+    {"cfg_select", MacroBuiltin::cfg_select_handler},
 };
 
 tl::optional<BuiltinMacro>
diff --git a/gcc/rust/expand/rust-macro-expand.cc 
b/gcc/rust/expand/rust-macro-expand.cc
index 30373722e8c8..3b798202edb1 100644
--- a/gcc/rust/expand/rust-macro-expand.cc
+++ b/gcc/rust/expand/rust-macro-expand.cc
@@ -329,6 +329,24 @@ MacroExpander::expand_invoc (AST::MacroInvocation &invoc,
       return;
     }
 
+  // TODO: Also remove code below as we progress to Rust 1.90, when cfg_select
+  // gets added to nightly.
+  auto assume_builtin_cfg_select
+    = Session::get_instance ().should_support_cfg_select ()
+      && (invoc.get_invoc_data ().get_path ().as_string () == "cfg_select")
+      && !rules_def;
+
+  if (assume_builtin_cfg_select)
+    {
+      fragment = MacroBuiltin::cfg_select_handler (invoc.get_locus (),
+                                                  invoc_data, semicolon)
+                  .value_or (AST::Fragment::create_empty ());
+
+      set_expanded_fragment (std::move (fragment));
+
+      return;
+    }
+
   // If there's no rule associated with the invocation, we can simply return
   // early. The early name resolver will have already emitted an error.
   if (!rules_def)
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc 
b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
index 56f91db89dcd..830932cdd7fb 100644
--- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
+++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc
@@ -339,6 +339,11 @@ Early::visit (AST::MacroInvocation &invoc)
   auto resolve_offset_of = Session::get_instance ().should_support_offset_of ()
                           && (path.as_string () == "offset_of");
 
+  // Ditto, but for `cfg_select!()`.
+  auto resolve_cfg_select
+    = Session::get_instance ().should_support_cfg_select ()
+      && (path.as_string () == "cfg_select");
+
   if (invoc.get_kind () == AST::MacroInvocation::InvocKind::Builtin)
     for (auto &pending_invoc : invoc.get_pending_eager_invocations ())
       pending_invoc->accept_vis (*this);
@@ -366,10 +371,10 @@ Early::visit (AST::MacroInvocation &invoc)
     ns_def = ctx.resolve_path (path, Namespace::Macros);
 
   // if the definition still does not have a value, then it's an error - unless
-  // we should automatically resolve offset_of!() calls
+  // we should automatically resolve offset_of!() or cfg_select!() calls
   if (!ns_def.has_value ())
     {
-      if (!resolve_offset_of)
+      if (!resolve_offset_of && !resolve_cfg_select)
        collect_error (Error (invoc.get_locus (), ErrorCode::E0433,
                              "could not resolve macro invocation %qs",
                              path.as_string ().c_str ()));
diff --git a/gcc/rust/rust-session-manager.h b/gcc/rust/rust-session-manager.h
index 0a6cc8117dfc..9f0209b90fdd 100644
--- a/gcc/rust/rust-session-manager.h
+++ b/gcc/rust/rust-session-manager.h
@@ -509,6 +509,11 @@ public:
 
   bool should_support_offset_of () const { return get_compat_version () >= 71; 
}
 
+  bool should_support_cfg_select () const
+  {
+    return get_compat_version () >= 90;
+  }
+
 private:
   Session () : mappings (Analysis::Mappings::get ()) {}
   void compile_crate (const char *filename);
diff --git a/gcc/testsuite/rust/compile/c_string_null_byte_check.rs 
b/gcc/testsuite/rust/compile/c_string_null_byte_check.rs
index 6c872e000761..57dfe8623cae 100644
--- a/gcc/testsuite/rust/compile/c_string_null_byte_check.rs
+++ b/gcc/testsuite/rust/compile/c_string_null_byte_check.rs
@@ -1,12 +1,7 @@
-// { dg-additional-options "-frust-c-style-string-literals" }
-#![feature(no_core, lang_items, rustc_attrs)]
+// { dg-additional-options "-frust-c-style-string-literals 
-frust-compat-version=1.90" }
+#![feature(no_core, lang_items)]
 #![no_core]
 
-#[rustc_builtin_macro]
-macro_rules! cfg_select {
-    () => {{}};
-}
-
 cfg_select! {
     all(
         not(windows),
diff --git a/gcc/testsuite/rust/execute/torture/c_string.rs 
b/gcc/testsuite/rust/execute/torture/c_string.rs
index 9df72b8f033a..be90e4e1c34c 100644
--- a/gcc/testsuite/rust/execute/torture/c_string.rs
+++ b/gcc/testsuite/rust/execute/torture/c_string.rs
@@ -1,13 +1,8 @@
-// { dg-additional-options "-frust-c-style-string-literals" }
+// { dg-additional-options "-frust-c-style-string-literals 
-frust-compat-version=1.90" }
 // { dg-output "gccrs" }
-#![feature(no_core, lang_items, rustc_attrs)]
+#![feature(no_core, lang_items)]
 #![no_core]
 
-#[rustc_builtin_macro]
-macro_rules! cfg_select {
-    () => {{}};
-}
-
 cfg_select! {
     all(
         not(windows),
diff --git a/gcc/testsuite/rust/execute/torture/c_string_ensure_null_term.rs 
b/gcc/testsuite/rust/execute/torture/c_string_ensure_null_term.rs
index a880bb735a3d..488d9fdcd5a4 100644
--- a/gcc/testsuite/rust/execute/torture/c_string_ensure_null_term.rs
+++ b/gcc/testsuite/rust/execute/torture/c_string_ensure_null_term.rs
@@ -1,5 +1,5 @@
-// { dg-additional-options "-frust-c-style-string-literals" }
-#![feature(no_core, intrinsics, staged_api, lang_items, rustc_attrs)]
+// { dg-additional-options "-frust-c-style-string-literals 
-frust-compat-version=1.90" }
+#![feature(no_core, intrinsics, staged_api, lang_items)]
 #![no_core]
 
 #[lang = "sized"]
@@ -26,11 +26,6 @@ impl<T> *const T {
     }
 }
 
-#[rustc_builtin_macro]
-macro_rules! cfg_select {
-    () => {{}};
-}
-
 cfg_select! {
     all(
         not(windows),
diff --git a/gcc/testsuite/rust/execute/torture/cfg_select1.rs 
b/gcc/testsuite/rust/execute/torture/cfg_select1.rs
index 5a37dcc6cc2a..fda698e38cc6 100644
--- a/gcc/testsuite/rust/execute/torture/cfg_select1.rs
+++ b/gcc/testsuite/rust/execute/torture/cfg_select1.rs
@@ -1,13 +1,8 @@
-// { dg-additional-options "-frust-cfg=A=\"foo\"" }
+// { dg-additional-options "-frust-compat-version=1.90 -frust-cfg=A=\"foo\"" }
 // { dg-output "wildcard\r*\n" }
-#![feature(no_core, rustc_attrs)]
+#![feature(no_core)]
 #![no_core]
 
-#[rustc_builtin_macro]
-macro_rules! cfg_select {
-    () => {{}};
-}
-
 extern "C" {
     fn printf(s: *const i8, ...);
 }
@@ -28,4 +23,4 @@ fn main() -> i32 {
         }
     }
     return 0;
-}
\ No newline at end of file
+}
diff --git a/gcc/testsuite/rust/execute/torture/cfg_select2.rs 
b/gcc/testsuite/rust/execute/torture/cfg_select2.rs
index fe0ad608ec71..2a6c5af7b06e 100644
--- a/gcc/testsuite/rust/execute/torture/cfg_select2.rs
+++ b/gcc/testsuite/rust/execute/torture/cfg_select2.rs
@@ -1,13 +1,8 @@
-// { dg-additional-options "-frust-cfg=A=\"foo\"" }
+// { dg-additional-options "-frust-compat-version=1.90 -frust-cfg=A=\"foo\"" }
 // { dg-output "pass\r*\n" }
-#![feature(no_core, rustc_attrs)]
+#![feature(no_core)]
 #![no_core]
 
-#[rustc_builtin_macro]
-macro_rules! cfg_select {
-    () => {{}};
-}
-
 extern "C" {
     fn printf(s: *const i8, ...);
 }
@@ -28,4 +23,4 @@ fn main() -> i32 {
         }
     }
     return 0;
-}
\ No newline at end of file
+}

Reply via email to