From: Pierre-Emmanuel Patry <[email protected]>

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]>
---
 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 +--
 .../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(-)
 create mode 100644 gcc/testsuite/rust/compile/missing_staged_api.rs

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<T>() -> 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 {}
-- 
2.50.1

Reply via email to