From: Pierre-Emmanuel Patry Date: Thu, 30 Apr 2026 13:46:13 +0000 (+0200) Subject: gccrs: Add feature gate for rustc_const_stable attribute X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c2fee62573cbb12836535381cedaa77930e378c;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/rust/checks/errors/feature/rust-feature-gate.cc b/gcc/rust/checks/errors/feature/rust-feature-gate.cc index 8c6d5ba2f56..775df43791a 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 5548573fc33..a78b146b9f7 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 3e9fe62a410..d35fe633947 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 7e091b0a0cd..14aa38c9cd4 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 1d3ef9a0fe8..cac0b101a64 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 bbc1c880fbb..96706175291 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 6dca6f28c1f..0b01bcf1ffc 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 00000000000..49b4c045194 --- /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() -> usize; + } +} diff --git a/gcc/testsuite/rust/compile/rustc_const_stable.rs b/gcc/testsuite/rust/compile/rustc_const_stable.rs index 77bb4b81ff7..619d6e44301 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 977f8ef566d..7c26f46775e 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 56bf72280d5..8ec3d98cf65 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 5275df29cc0..8ff82dcba54 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 903d2ad3878..89c97b485fc 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 fc6b0635442..242230803de 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 869dcce27db..01c9f985f76 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 20735c59ca8..5363e1c860f 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 a3622563d57..5bb86797226 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 f7ae38f55ad..2f2b9094b34 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 72083d7e37d..b088a62846f 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 1e87579d157..d8238fae13d 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 3a4b93f925b..6f7e0061811 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 5588df59c59..2af175b7c99 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 {}