https://gcc.gnu.org/g:5c2fee62573cbb12836535381cedaa77930e378c

commit r17-1082-g5c2fee62573cbb12836535381cedaa77930e378c
Author: Pierre-Emmanuel Patry <[email protected]>
Date:   Thu Apr 30 15:46:13 2026 +0200

    gccrs: Add feature gate for rustc_const_stable attribute
    
    rustc_const_stable attributes are used within the core library but were
    not properly feature gated. The compiler now rejects their usage when
    the feature has not been explicitly enabled.
    
    gcc/rust/ChangeLog:
    
            * checks/errors/feature/rust-feature-gate.cc (FeatureGate::visit): 
Add
            a feature gate around rustc_const_stable attributes.
    
    gcc/testsuite/ChangeLog:
    
            * rust/compile/const-issue1440.rs: Enable staged_api feature.
            * rust/compile/for-loop1.rs: Likewise.
            * rust/compile/for-loop2.rs: Likewise.
            * rust/compile/issue-1031.rs: Likewise.
            * rust/compile/issue-1289.rs: Likewise.
            * rust/compile/iterators1.rs: Likewise.
            * rust/compile/rustc_const_stable.rs: Likewise.
            * rust/compile/torture/issue-1075.rs: Likewise.
            * rust/compile/torture/issue-1432.rs: Likewise.
            * rust/execute/torture/const-generics-7.rs: Likewise.
            * rust/execute/torture/for-loop1.rs: Likewise.
            * rust/execute/torture/for-loop2.rs: Likewise.
            * rust/execute/torture/issue-1120.rs: Likewise.
            * rust/execute/torture/issue-1133.rs: Likewise.
            * rust/execute/torture/issue-1232.rs: Likewise.
            * rust/execute/torture/issue-1436.rs: Likewise.
            * rust/execute/torture/iter1.rs: Likewise.
            * rust/execute/torture/slice-magic.rs: Likewise.
            * rust/execute/torture/slice-magic2.rs: Likewise.
            * rust/execute/torture/str-layout1.rs: Likewise.
            * rust/compile/missing_staged_api.rs: New test.
    
    Signed-off-by: Pierre-Emmanuel Patry <[email protected]>

Diff:
---
 gcc/rust/checks/errors/feature/rust-feature-gate.cc    | 10 ++++++++++
 gcc/testsuite/rust/compile/const-issue1440.rs          |  3 +--
 gcc/testsuite/rust/compile/for-loop1.rs                |  2 +-
 gcc/testsuite/rust/compile/for-loop2.rs                |  3 +--
 gcc/testsuite/rust/compile/issue-1031.rs               |  4 +---
 gcc/testsuite/rust/compile/issue-1289.rs               |  4 +---
 gcc/testsuite/rust/compile/iterators1.rs               |  3 +--
 gcc/testsuite/rust/compile/missing_staged_api.rs       | 12 ++++++++++++
 gcc/testsuite/rust/compile/rustc_const_stable.rs       |  2 +-
 gcc/testsuite/rust/compile/torture/issue-1075.rs       |  3 +--
 gcc/testsuite/rust/compile/torture/issue-1432.rs       |  3 +--
 gcc/testsuite/rust/execute/torture/const-generics-7.rs |  4 +---
 gcc/testsuite/rust/execute/torture/for-loop1.rs        |  2 +-
 gcc/testsuite/rust/execute/torture/for-loop2.rs        |  2 +-
 gcc/testsuite/rust/execute/torture/issue-1120.rs       |  4 +---
 gcc/testsuite/rust/execute/torture/issue-1133.rs       |  4 +---
 gcc/testsuite/rust/execute/torture/issue-1232.rs       |  4 +---
 gcc/testsuite/rust/execute/torture/issue-1436.rs       |  5 +----
 gcc/testsuite/rust/execute/torture/iter1.rs            |  3 +--
 gcc/testsuite/rust/execute/torture/slice-magic.rs      |  4 +---
 gcc/testsuite/rust/execute/torture/slice-magic2.rs     |  4 +---
 gcc/testsuite/rust/execute/torture/str-layout1.rs      |  4 +---
 22 files changed, 42 insertions(+), 47 deletions(-)

diff --git a/gcc/rust/checks/errors/feature/rust-feature-gate.cc 
b/gcc/rust/checks/errors/feature/rust-feature-gate.cc
index 8c6d5ba2f567..775df43791ae 100644
--- a/gcc/rust/checks/errors/feature/rust-feature-gate.cc
+++ b/gcc/rust/checks/errors/feature/rust-feature-gate.cc
@@ -234,6 +234,16 @@ FeatureGate::visit (AST::Function &function)
   if (!function.is_external ())
     check_rustc_attri (function.get_outer_attrs ());
 
+  for (const AST::Attribute &attr : function.get_outer_attrs ())
+    {
+      if (attr.get_path ().as_string () == "rustc_const_stable")
+       {
+         gate (Feature::Name::STAGED_API, attr.get_locus (),
+               "stability attributes may not be used outside of the standard "
+               "library");
+       }
+    }
+
   check_lang_item_attribute (function.get_outer_attrs ());
 
   note_stability_attribute (function.get_outer_attrs ());
diff --git a/gcc/testsuite/rust/compile/const-issue1440.rs 
b/gcc/testsuite/rust/compile/const-issue1440.rs
index 5548573fc339..a78b146b9f78 100644
--- a/gcc/testsuite/rust/compile/const-issue1440.rs
+++ b/gcc/testsuite/rust/compile/const-issue1440.rs
@@ -1,9 +1,8 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
 #![feature(intrinsics)]
-
+#![feature(staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/compile/for-loop1.rs 
b/gcc/testsuite/rust/compile/for-loop1.rs
index 3e9fe62a410c..d35fe633947c 100644
--- a/gcc/testsuite/rust/compile/for-loop1.rs
+++ b/gcc/testsuite/rust/compile/for-loop1.rs
@@ -1,8 +1,8 @@
 // { dg-output "loop\r*\nloop\r*\n" }
 #![feature(no_core)]
 #![no_core]
-
 #![feature(intrinsics, lang_items)]
+#![feature(staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/compile/for-loop2.rs 
b/gcc/testsuite/rust/compile/for-loop2.rs
index 7e091b0a0cdc..14aa38c9cd48 100644
--- a/gcc/testsuite/rust/compile/for-loop2.rs
+++ b/gcc/testsuite/rust/compile/for-loop2.rs
@@ -1,8 +1,7 @@
 // { dg-output "1\r*\n2\r*\n" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics, lang_items)]
+#![feature(intrinsics, lang_items, staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/compile/issue-1031.rs 
b/gcc/testsuite/rust/compile/issue-1031.rs
index 1d3ef9a0fe80..cac0b101a64d 100644
--- a/gcc/testsuite/rust/compile/issue-1031.rs
+++ b/gcc/testsuite/rust/compile/issue-1031.rs
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/compile/issue-1289.rs 
b/gcc/testsuite/rust/compile/issue-1289.rs
index bbc1c880fbb6..967061752915 100644
--- a/gcc/testsuite/rust/compile/issue-1289.rs
+++ b/gcc/testsuite/rust/compile/issue-1289.rs
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/compile/iterators1.rs 
b/gcc/testsuite/rust/compile/iterators1.rs
index 6dca6f28c1fd..0b01bcf1ffca 100644
--- a/gcc/testsuite/rust/compile/iterators1.rs
+++ b/gcc/testsuite/rust/compile/iterators1.rs
@@ -1,7 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics, lang_items)]
+#![feature(intrinsics, lang_items, staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/compile/missing_staged_api.rs 
b/gcc/testsuite/rust/compile/missing_staged_api.rs
new file mode 100644
index 000000000000..49b4c0451943
--- /dev/null
+++ b/gcc/testsuite/rust/compile/missing_staged_api.rs
@@ -0,0 +1,12 @@
+#![feature(no_core)]
+#![feature(intrinsics)]
+#![no_core]
+
+pub mod intrinsics {
+
+    extern "rust-intrinsic" {
+        // { dg-error "stability attributes may not be used outside of the 
standard library" "" { target *-*-* } .+1 }
+        #[rustc_const_stable(feature = "const_size_of", since = "1.40.0")]
+        pub fn size_of<T>() -> usize;
+    }
+}
diff --git a/gcc/testsuite/rust/compile/rustc_const_stable.rs 
b/gcc/testsuite/rust/compile/rustc_const_stable.rs
index 77bb4b81ff72..619d6e44301c 100644
--- a/gcc/testsuite/rust/compile/rustc_const_stable.rs
+++ b/gcc/testsuite/rust/compile/rustc_const_stable.rs
@@ -1,7 +1,7 @@
 #![feature(no_core)]
 #![no_core]
-
 #![feature(rustc_attrs)]
+#![feature(staged_api)]
 
 #[rustc_const_stable(feature = "const_ascii_ctype_on_intrinsics", since = 
"1.47.0")]
 pub fn foo() {}
diff --git a/gcc/testsuite/rust/compile/torture/issue-1075.rs 
b/gcc/testsuite/rust/compile/torture/issue-1075.rs
index 977f8ef566d9..7c26f46775ee 100644
--- a/gcc/testsuite/rust/compile/torture/issue-1075.rs
+++ b/gcc/testsuite/rust/compile/torture/issue-1075.rs
@@ -1,9 +1,8 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
 #![feature(intrinsics)]
-
+#![feature(staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/compile/torture/issue-1432.rs 
b/gcc/testsuite/rust/compile/torture/issue-1432.rs
index 56bf72280d55..8ec3d98cf65d 100644
--- a/gcc/testsuite/rust/compile/torture/issue-1432.rs
+++ b/gcc/testsuite/rust/compile/torture/issue-1432.rs
@@ -1,9 +1,8 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
 #![feature(intrinsics)]
-
+#![feature(staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/const-generics-7.rs 
b/gcc/testsuite/rust/execute/torture/const-generics-7.rs
index 5275df29cc0f..8ff82dcba543 100644
--- a/gcc/testsuite/rust/execute/torture/const-generics-7.rs
+++ b/gcc/testsuite/rust/execute/torture/const-generics-7.rs
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/for-loop1.rs 
b/gcc/testsuite/rust/execute/torture/for-loop1.rs
index 903d2ad3878a..89c97b485fc1 100644
--- a/gcc/testsuite/rust/execute/torture/for-loop1.rs
+++ b/gcc/testsuite/rust/execute/torture/for-loop1.rs
@@ -2,7 +2,7 @@
 #![feature(no_core)]
 #![no_core]
 
-#![feature(intrinsics, lang_items)]
+#![feature(intrinsics, lang_items, staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/execute/torture/for-loop2.rs 
b/gcc/testsuite/rust/execute/torture/for-loop2.rs
index fc6b06354426..242230803de2 100644
--- a/gcc/testsuite/rust/execute/torture/for-loop2.rs
+++ b/gcc/testsuite/rust/execute/torture/for-loop2.rs
@@ -2,7 +2,7 @@
 #![feature(no_core)]
 #![no_core]
 
-#![feature(intrinsics, lang_items)]
+#![feature(intrinsics, lang_items, staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/execute/torture/issue-1120.rs 
b/gcc/testsuite/rust/execute/torture/issue-1120.rs
index 869dcce27dbf..01c9f985f766 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1120.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1120.rs
@@ -1,9 +1,7 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/issue-1133.rs 
b/gcc/testsuite/rust/execute/torture/issue-1133.rs
index 20735c59ca8b..5363e1c860fa 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1133.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1133.rs
@@ -1,9 +1,7 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/issue-1232.rs 
b/gcc/testsuite/rust/execute/torture/issue-1232.rs
index a3622563d578..5bb867972267 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1232.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1232.rs
@@ -2,9 +2,7 @@
 // { dg-output "slice_access=3\r*\n" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/issue-1436.rs 
b/gcc/testsuite/rust/execute/torture/issue-1436.rs
index f7ae38f55ad7..2f2b9094b348 100644
--- a/gcc/testsuite/rust/execute/torture/issue-1436.rs
+++ b/gcc/testsuite/rust/execute/torture/issue-1436.rs
@@ -1,10 +1,7 @@
 // { dg-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/iter1.rs 
b/gcc/testsuite/rust/execute/torture/iter1.rs
index 72083d7e37d4..b088a62846f6 100644
--- a/gcc/testsuite/rust/execute/torture/iter1.rs
+++ b/gcc/testsuite/rust/execute/torture/iter1.rs
@@ -1,8 +1,7 @@
 // { dg-output "1\r*\n2\r*\n" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics, lang_items)]
+#![feature(intrinsics, lang_items, staged_api)]
 
 pub use option::Option::{self, None, Some};
 pub use result::Result::{self, Err, Ok};
diff --git a/gcc/testsuite/rust/execute/torture/slice-magic.rs 
b/gcc/testsuite/rust/execute/torture/slice-magic.rs
index 1e87579d1571..d8238fae13d4 100644
--- a/gcc/testsuite/rust/execute/torture/slice-magic.rs
+++ b/gcc/testsuite/rust/execute/torture/slice-magic.rs
@@ -1,9 +1,7 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/slice-magic2.rs 
b/gcc/testsuite/rust/execute/torture/slice-magic2.rs
index 3a4b93f925bd..6f7e0061811b 100644
--- a/gcc/testsuite/rust/execute/torture/slice-magic2.rs
+++ b/gcc/testsuite/rust/execute/torture/slice-magic2.rs
@@ -1,9 +1,7 @@
 // { dg-additional-options "-w" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
diff --git a/gcc/testsuite/rust/execute/torture/str-layout1.rs 
b/gcc/testsuite/rust/execute/torture/str-layout1.rs
index 5588df59c59d..2af175b7c991 100644
--- a/gcc/testsuite/rust/execute/torture/str-layout1.rs
+++ b/gcc/testsuite/rust/execute/torture/str-layout1.rs
@@ -2,9 +2,7 @@
 // { dg-output "t1sz=5 t2sz=10\r*" }
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}

Reply via email to