From: Yap Zhi Heng <[email protected]>
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]>
---
gcc/rust/expand/rust-macro-builtins.cc | 3 ++-
gcc/rust/expand/rust-macro-expand.cc | 18 ++++++++++++++++++
.../resolve/rust-early-name-resolver-2.0.cc | 9 +++++++--
gcc/rust/rust-session-manager.h | 5 +++++
.../rust/compile/c_string_null_byte_check.rs | 9 ++-------
gcc/testsuite/rust/execute/torture/c_string.rs | 9 ++-------
.../torture/c_string_ensure_null_term.rs | 9 ++-------
.../rust/execute/torture/cfg_select1.rs | 11 +++--------
.../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 df651fd9bbc..d96b23f9992 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 30373722e8c..3b798202edb 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 56f91db89dc..830932cdd7f 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 0a6cc8117df..9f0209b90fd 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 6c872e00076..57dfe8623ca 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 9df72b8f033..be90e4e1c34 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 a880bb735a3..488d9fdcd5a 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 5a37dcc6cc2..fda698e38cc 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 fe0ad608ec7..2a6c5af7b06 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
+}
--
2.50.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.