gccrs: Add feature gate for "rust-intrinsic".
authormxlol233 <mxlol233@outlook.com>
Sun, 5 Feb 2023 13:17:34 +0000 (21:17 +0800)
committerArthur Cohen <arthur.cohen@embecosm.com>
Thu, 6 Apr 2023 08:47:22 +0000 (10:47 +0200)
This commit implemented a feature gate to check `intrinsics`.

gcc/rust/ChangeLog:

* checks/errors/rust-feature-gate.cc: Add implementation for
`void FeatureGate::visit (AST::ExternBlock &block)`. Add `valid_feature`
construction process in `FeatureGate::check`.
* checks/errors/rust-feature-gate.h: Add declaration for
`void FeatureGate::visit (AST::ExternBlock &block)`. Add private
variable `valid_feature`.
* checks/errors/rust-feature.h: Change `issue` to `m_issue`.

gcc/testsuite/ChangeLog:

* rust/compile/const-issue1440.rs: Add crate feature: `intrinsics`.
* rust/compile/feature_intrinsics.rs: New file.
* rust/compile/issue-1031.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1130.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1131.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1237.rs: Add crate feature: `intrinsics`.
* rust/compile/issue-1289.rs: Add crate feature: `intrinsics`.
* rust/compile/rust-const-blog-issue.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-3.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-4.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-5.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-6.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/intrinsics-7.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1024.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1075.rs: Add crate feature: `intrinsics`.
* rust/compile/torture/issue-1432.rs: Add crate feature: `intrinsics`.
* rust/compile/unsafe10.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/atomic_load.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/atomic_store.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/copy_nonoverlapping1.rs: Add crate feature:
`intrinsics`.
* rust/execute/torture/issue-1120.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/issue-1133.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/issue-1232.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/slice-magic.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/slice-magic2.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/str-layout1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/transmute1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/wrapping_op1.rs: Add crate feature: `intrinsics`.
* rust/execute/torture/wrapping_op2.rs: Add crate feature: `intrinsics`.

Signed-off-by: Xiao Ma <mxlol233@outlook.com>
32 files changed:
gcc/rust/checks/errors/rust-feature-gate.cc
gcc/rust/checks/errors/rust-feature-gate.h
gcc/rust/checks/errors/rust-feature.h
gcc/testsuite/rust/compile/const-issue1440.rs
gcc/testsuite/rust/compile/feature_intrinsics.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/issue-1031.rs
gcc/testsuite/rust/compile/issue-1130.rs
gcc/testsuite/rust/compile/issue-1131.rs
gcc/testsuite/rust/compile/issue-1237.rs
gcc/testsuite/rust/compile/issue-1289.rs
gcc/testsuite/rust/compile/rust-const-blog-issue.rs
gcc/testsuite/rust/compile/torture/intrinsics-3.rs
gcc/testsuite/rust/compile/torture/intrinsics-4.rs
gcc/testsuite/rust/compile/torture/intrinsics-5.rs
gcc/testsuite/rust/compile/torture/intrinsics-6.rs
gcc/testsuite/rust/compile/torture/intrinsics-7.rs
gcc/testsuite/rust/compile/torture/issue-1024.rs
gcc/testsuite/rust/compile/torture/issue-1075.rs
gcc/testsuite/rust/compile/torture/issue-1432.rs
gcc/testsuite/rust/compile/unsafe10.rs
gcc/testsuite/rust/execute/torture/atomic_load.rs
gcc/testsuite/rust/execute/torture/atomic_store.rs
gcc/testsuite/rust/execute/torture/copy_nonoverlapping1.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/slice-magic.rs
gcc/testsuite/rust/execute/torture/slice-magic2.rs
gcc/testsuite/rust/execute/torture/str-layout1.rs
gcc/testsuite/rust/execute/torture/transmute1.rs
gcc/testsuite/rust/execute/torture/wrapping_op1.rs
gcc/testsuite/rust/execute/torture/wrapping_op2.rs

index 31ce367..bd01b52 100644 (file)
 // <http://www.gnu.org/licenses/>.
 
 #include "rust-feature-gate.h"
-#include "rust-feature.h"
+#include "rust-abi.h"
 
 namespace Rust {
 
 void
 FeatureGate::check (AST::Crate &crate)
 {
-  std::vector<Feature> valid_features;
+  valid_features.clear ();
+
   for (const auto &attr : crate.inner_attrs)
     {
       if (attr.get_path ().as_string () == "feature")
@@ -39,20 +40,22 @@ FeatureGate::check (AST::Crate &crate)
                option.parse_to_meta_item ());
              for (const auto &item : meta_item->get_items ())
                {
-                 const auto &name = item->as_string ();
-                 auto tname = Feature::as_name (name);
+                 const auto &name_str = item->as_string ();
+                 auto tname = Feature::as_name (name_str);
                  if (!tname.is_none ())
-                   valid_features.push_back (Feature::create (tname.get ()));
+                   {
+                     auto name = tname.get ();
+                     valid_features.insert (name);
+                   }
+
                  else
                    rust_error_at (item->get_locus (), "unknown feature '%s'",
-                                  name.c_str ());
+                                  name_str.c_str ());
                }
            }
        }
     }
-  valid_features.shrink_to_fit ();
 
-  // TODO (mxlol233): add the real feature gate stuff.
   auto &items = crate.items;
   for (auto it = items.begin (); it != items.end (); it++)
     {
@@ -60,4 +63,46 @@ FeatureGate::check (AST::Crate &crate)
       item->accept_vis (*this);
     }
 }
+
+void
+FeatureGate::gate (Feature::Name name, Location loc,
+                  const std::string &error_msg)
+{
+  if (!valid_features.count (name))
+    {
+      auto feature = Feature::create (name);
+      auto issue = feature.issue ();
+      if (issue > 0)
+       {
+         const char *fmt_str
+           = "%s. see issue %ld "
+             "<https://github.com/rust-lang/rust/issues/%ld> for more "
+             "information. add `#![feature(%s)]` to the crate attributes to "
+             "enable.";
+         rust_error_at (loc, fmt_str, error_msg.c_str (), issue, issue,
+                        feature.as_string ().c_str ());
+       }
+      else
+       {
+         const char *fmt_str
+           = "%s. add `#![feature(%s)]` to the crate attributes to enable.";
+         rust_error_at (loc, fmt_str, error_msg.c_str (),
+                        feature.as_string ().c_str ());
+       }
+    }
+}
+
+void
+FeatureGate::visit (AST::ExternBlock &block)
+{
+  if (block.has_abi ())
+    {
+      const auto abi = block.get_abi ();
+
+      if (get_abi_from_string (abi) == ABI::INTRINSIC)
+       gate (Feature::Name::INTRINSICS, block.get_locus (),
+             "intrinsics are subject to change");
+    }
+}
+
 } // namespace Rust
\ No newline at end of file
index dc95c6b..6768c4c 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "rust-ast-visitor.h"
 #include "rust-ast-full.h"
+#include "rust-feature.h"
 
 namespace Rust {
 
@@ -136,7 +137,7 @@ public:
   void visit (AST::TraitImpl &impl) override {}
   void visit (AST::ExternalStaticItem &item) override {}
   void visit (AST::ExternalFunctionItem &item) override {}
-  void visit (AST::ExternBlock &block) override {}
+  void visit (AST::ExternBlock &block) override;
   void visit (AST::MacroMatchFragment &match) override {}
   void visit (AST::MacroMatchRepetition &match) override {}
   void visit (AST::MacroMatcher &matcher) override {}
@@ -186,6 +187,10 @@ public:
   void visit (AST::SliceType &type) override {}
   void visit (AST::InferredType &type) override {}
   void visit (AST::BareFunctionType &type) override {}
+
+private:
+  void gate (Feature::Name name, Location loc, const std::string &error_msg);
+  std::set<Feature::Name> valid_features;
 };
 } // namespace Rust
 #endif
\ No newline at end of file
index 1425e26..7bd76c0 100644 (file)
@@ -47,6 +47,7 @@ public:
   Name name () { return m_name; }
   const std::string &description () { return m_description; }
   State state () { return m_state; }
+  uint64_t issue () { return m_issue; }
 
   static Optional<Name> as_name (const std::string &name);
   static Feature create (Name name);
@@ -57,7 +58,7 @@ private:
           const Optional<CompileOptions::Edition> &edition,
           const char *description)
     : m_state (state), m_name (name), m_name_str (name_str),
-      m_rustc_since (rustc_since), issue (issue_number), edition (edition),
+      m_rustc_since (rustc_since), m_issue (issue_number), edition (edition),
       m_description (description)
   {}
 
@@ -65,7 +66,7 @@ private:
   Name m_name;
   std::string m_name_str;
   std::string m_rustc_since;
-  uint64_t issue;
+  uint64_t m_issue;
   Optional<CompileOptions::Edition> edition;
   std::string m_description;
 
index 9b974b9..9ad76a9 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
 
 mod intrinsics {
     extern "rust-intrinsic" {
diff --git a/gcc/testsuite/rust/compile/feature_intrinsics.rs b/gcc/testsuite/rust/compile/feature_intrinsics.rs
new file mode 100644 (file)
index 0000000..5eb7ffe
--- /dev/null
@@ -0,0 +1,7 @@
+
+extern "rust-intrinsic" { //{ dg-error "intrinsics are subject to change." "" { target *-*-* }  }
+    pub fn sqrtf32(x: f32) -> f32;
+}
+
+fn main() {
+}
index 5ba8f7a..a9049de 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 92200c7..6d265cb 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 mod mem {
     extern "rust-intrinsic" {
         fn size_of<T>() -> usize;
index fd158ab..5cb9caf 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     fn size_of<T>() -> usize;
     fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 542be89..54a51df 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 mod intrinsics {
     extern "rust-intrinsic" {
         pub fn offset<T>(ptr: *const T, count: isize) -> *const T;
index eb41af0..3d7716a 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "C" {
     fn printf(s: *const i8, ...);
 }
index a5ea2eb..679a2ae 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-excess-errors "accessing value of"  }
+#![feature(intrinsics)]
+
 mod mem {
     extern "rust-intrinsic" {
         #[rustc_const_stable(feature = "const_transmute", since = "1.46.0")]
index 5c131bd..1601ab6 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     fn not_an_intrinsic();
 }
index 143b62a..4e510e1 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn unchecked_add<T>(x: T, y: T) -> T;
     pub fn unchecked_sub<T>(x: T, y: T) -> T;
index 8e8c5fe..da85fff 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn unchecked_add<T>(x: T, y: T) -> T;
     // { dg-error "unchecked operation intrinsics can only be used with basic integer types .got .NotAdd.." "" { target *-*-* } .-1 }
index 1095409..a8503ce 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn size_of<T>() -> usize;
 }
index 7c0a043..201a241 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 083a369..822ca41 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
 mod intrinsics {
     extern "rust-intrinsic" {
         #[rustc_const_stable(feature = "const_int_wrapping", since = "1.40.0")]
index 6b6be06..927e697 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn rotate_left<T>(l: T, r: T) -> T;
 }
index 2ae7a08..39afd34 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: usize);
 }
index 242c94b..59792b2 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index f2080a6..8679bb9 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 9215efd..ce53da2 100644 (file)
@@ -1,5 +1,7 @@
 // { dg-additional-options "-w" }
 // { dg-output "slice_access=3\r*\n" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     fn offset<T>(dst: *const T, offset: isize) -> *const T;
index d113298..b52aa3d 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 64a5661..cdc39f3 100644 (file)
@@ -1,4 +1,6 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     #[rustc_const_stable(feature = "const_ptr_offset", since = "1.61.0")]
     pub fn offset<T>(dst: *const T, offset: isize) -> *const T;
index 39c1e38..c9bcf16 100644 (file)
@@ -1,5 +1,7 @@
 // { dg-additional-options "-w" }
 // { dg-output "t1sz=5 t2sz=10\r*" }
+#![feature(intrinsics)]
+
 mod mem {
     extern "rust-intrinsic" {
         #[rustc_const_stable(feature = "const_transmute", since = "1.46.0")]
index b9ec38c..40dcfde 100644 (file)
@@ -1,4 +1,5 @@
 // { dg-additional-options "-w" }
+#![feature(intrinsics)]
 
 extern "rust-intrinsic" {
     fn transmute<T, U>(value: T) -> U;
index 64b3708..ab4afd7 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn wrapping_add<T>(l: T, r: T) -> T;
 }
index f999015..b24ebce 100644 (file)
@@ -1,3 +1,5 @@
+#![feature(intrinsics)]
+
 extern "rust-intrinsic" {
     pub fn wrapping_add<T>(l: T, r: T) -> T;
     pub fn wrapping_sub<T>(l: T, r: T) -> T;