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 {}
