]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add feature gate for rustc_const_stable attribute
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Thu, 30 Apr 2026 13:46:13 +0000 (15:46 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 1 Jun 2026 13:24:52 +0000 (15:24 +0200)
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 <pierre-emmanuel.patry@embecosm.com>
22 files changed:
gcc/rust/checks/errors/feature/rust-feature-gate.cc
gcc/testsuite/rust/compile/const-issue1440.rs
gcc/testsuite/rust/compile/for-loop1.rs
gcc/testsuite/rust/compile/for-loop2.rs
gcc/testsuite/rust/compile/issue-1031.rs
gcc/testsuite/rust/compile/issue-1289.rs
gcc/testsuite/rust/compile/iterators1.rs
gcc/testsuite/rust/compile/missing_staged_api.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/rustc_const_stable.rs
gcc/testsuite/rust/compile/torture/issue-1075.rs
gcc/testsuite/rust/compile/torture/issue-1432.rs
gcc/testsuite/rust/execute/torture/const-generics-7.rs
gcc/testsuite/rust/execute/torture/for-loop1.rs
gcc/testsuite/rust/execute/torture/for-loop2.rs
gcc/testsuite/rust/execute/torture/issue-1120.rs
gcc/testsuite/rust/execute/torture/issue-1133.rs
gcc/testsuite/rust/execute/torture/issue-1232.rs
gcc/testsuite/rust/execute/torture/issue-1436.rs
gcc/testsuite/rust/execute/torture/iter1.rs
gcc/testsuite/rust/execute/torture/slice-magic.rs
gcc/testsuite/rust/execute/torture/slice-magic2.rs
gcc/testsuite/rust/execute/torture/str-layout1.rs

index 8c6d5ba2f5671188cafb4118768950b7d6eef052..775df43791ae782b1c78e1c7bdff9b4b1413dce7 100644 (file)
@@ -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 ());
index 5548573fc3394ff6245ee6f8b2de4096be8de1ff..a78b146b9f78cb232d05cbe12e4c1455df84cbbb 100644 (file)
@@ -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 {}
index 3e9fe62a410ccf111977734d6bb557e66f4f317f..d35fe633947ccdb0fa21da4a85ddf644d63d9880 100644 (file)
@@ -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};
index 7e091b0a0cdc7dc41d6d06c9101d4dfdfc78fa4a..14aa38c9cd48c9797553380b53ad3e9e52224cde 100644 (file)
@@ -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};
index 1d3ef9a0fe800d0e9163a113d4fab07f7984f0ba..cac0b101a64d011c2ad6b56631fab3fd24b7cdbb 100644 (file)
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
index bbc1c880fbb61a2c7dee43e545562a1a535f8e4d..967061752915b1762024e8c88bfd0edbd77c368c 100644 (file)
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
index 6dca6f28c1fd27ba553be2867200d3fdeeee448a..0b01bcf1ffca66b36feb9545803f284064b5a002 100644 (file)
@@ -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 (file)
index 0000000..49b4c04
--- /dev/null
@@ -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;
+    }
+}
index 77bb4b81ff72958f6cf0c8b309fcfb98a0d33777..619d6e44301c37f1dc64d0a19cc67fea75238282 100644 (file)
@@ -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() {}
index 977f8ef566d94bf0b848b7e685fe6f8e776c38ad..7c26f46775ee947ee6e96bdec426acc04de26e88 100644 (file)
@@ -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 {}
index 56bf72280d55ff845401ac05ed6019f5546ebb7a..8ec3d98cf65d6771057450be5e8880fd77ea0434 100644 (file)
@@ -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 {}
index 5275df29cc0f88b8335e4a4d958426777bc19cb6..8ff82dcba543c0a48bf3d0831d54cfe35daecbcf 100644 (file)
@@ -1,8 +1,6 @@
 #![feature(no_core)]
 #![no_core]
-
-#![feature(intrinsics)]
-
+#![feature(intrinsics, staged_api)]
 #![feature(lang_items)]
 #[lang = "sized"]
 pub trait Sized {}
index 903d2ad3878ab909132c93f0b59942839e7f37c4..89c97b485fc104827e3b1e1869f04147a429c92d 100644 (file)
@@ -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};
index fc6b0635442632b12aa922c564731ba6e2aae600..242230803de238e961bcc4a148a5fcccb1ddfb08 100644 (file)
@@ -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};
index 869dcce27dbf113152a92bf19e49bf6074daad19..01c9f985f766b8ab79c78afc0375fff48640b6b2 100644 (file)
@@ -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 {}
index 20735c59ca8b7031a2caf27a06cdb5b232d75df3..5363e1c860fa7322ddcc1d0a002d68bbc42a2d48 100644 (file)
@@ -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 {}
index a3622563d578c85c0cd1f652821b967ea523f490..5bb86797226724829a9a48f04a27f62de91d51d8 100644 (file)
@@ -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 {}
index f7ae38f55ad7b5be55ad4100fb275eeed976a578..2f2b9094b3480297727fbaa95ddadf5fed2a1997 100644 (file)
@@ -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 {}
index 72083d7e37d47fd9cb7cf2e9767cc2ccb6c85e10..b088a62846f66f86485ebf09cc9fd5b5db471ac1 100644 (file)
@@ -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};
index 1e87579d157180fcb77eb53ebbf75e0f28992fdd..d8238fae13d418e45dd1e854e4da9f3235176d9f 100644 (file)
@@ -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 {}
index 3a4b93f925bd54e2ed72292f79fa892ee3ef8175..6f7e0061811bc1c59a9531218b6a8fcdfe00c893 100644 (file)
@@ -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 {}
index 5588df59c59ddb8d0a9b73ef396e0aa00b3e792d..2af175b7c99195f39ab6cd06cbf66ba209c45339 100644 (file)
@@ -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 {}