]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Make gccrs recognize negative_impls
authorjjasmine <tanghocle456@gmail.com>
Wed, 15 May 2024 19:44:15 +0000 (12:44 -0700)
committerArthur Cohen <arthur.cohen@embecosm.com>
Mon, 17 Mar 2025 15:35:29 +0000 (16:35 +0100)
gcc/rust/ChangeLog:

* checks/errors/rust-feature-gate.cc (FeatureGate::visit): make
gccrs recognize negative_impls
* checks/errors/rust-feature-gate.h: likewise.
* checks/errors/rust-feature.cc (Feature::create): likewise.
* checks/errors/rust-feature.h: likewise.

gcc/testsuite/ChangeLog:

* rust/compile/negative_impls.rs: New test.
* rust/compile/negative_impls_2.rs: New test.

gcc/rust/checks/errors/rust-feature-gate.cc
gcc/rust/checks/errors/rust-feature-gate.h
gcc/rust/checks/errors/rust-feature.cc
gcc/rust/checks/errors/rust-feature.h
gcc/testsuite/rust/compile/negative_impls.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/negative_impls_2.rs [new file with mode: 0644]

index c20164455c2e558614ff14a11a6f2836ea856e28..6ef2d1f710fb8c2103f48ea48f2274ea8ffeee3a 100644 (file)
@@ -19,6 +19,7 @@
 #include "rust-feature-gate.h"
 #include "rust-abi.h"
 #include "rust-ast-visitor.h"
+#include "rust-feature.h"
 
 namespace Rust {
 
@@ -144,4 +145,12 @@ FeatureGate::visit (AST::ExternalTypeItem &item)
        "extern types are experimental");
 }
 
+void
+FeatureGate::visit (AST::TraitImpl &impl)
+{
+  if (impl.is_exclam ())
+    gate (Feature::Name::NEGATIVE_IMPLS, impl.get_locus (),
+         "negative_impls are not yet implemented");
+};
+
 } // namespace Rust
index 1782e6d66fb82b554ed69c6020c4f8b5273beb99..de48f22559871f2886907274733e00c0cc17fdf1 100644 (file)
@@ -127,6 +127,7 @@ public:
   void visit (AST::StaticItem &static_item) override {}
   void visit (AST::TraitItemConst &item) override {}
   void visit (AST::TraitItemType &item) override {}
+  void visit (AST::TraitImpl &impl) override;
   void visit (AST::Trait &trait) override {}
   void visit (AST::ExternalTypeItem &item) override;
   void visit (AST::ExternalStaticItem &item) override {}
index 92d10650df7be59c778c469ce9905da013a5cca9..1e11bd541a58d9f21a23c4a25450e75814f74c70 100644 (file)
@@ -42,6 +42,9 @@ Feature::create (Feature::Name name)
     case Feature::Name::EXTERN_TYPES:
       return Feature (Feature::Name::EXTERN_TYPES, Feature::State::ACTIVE,
                      "extern_types", "1.23.0", 43467, tl::nullopt, "");
+    case Feature::Name::NEGATIVE_IMPLS:
+      return Feature (Feature::Name::NEGATIVE_IMPLS, Feature::State::ACTIVE,
+                     "negative_impls", "1.0.0", 68318, tl::nullopt, "");
     default:
       rust_unreachable ();
     }
@@ -52,6 +55,7 @@ const std::map<std::string, Feature::Name> Feature::name_hash_map = {
   {"intrinsics", Feature::Name::INTRINSICS},
   {"rustc_attrs", Feature::Name::RUSTC_ATTRS},
   {"decl_macro", Feature::Name::DECL_MACRO},
+  {"negative_impls", Feature::Name::NEGATIVE_IMPLS},
   // TODO: Rename to "auto_traits" when supporting
   // later Rust versions
   {"optin_builtin_traits", Feature::Name::AUTO_TRAITS},
index 8eefb0f975485cd3911885f05b2613ebd78f76e5..611dceaa2c9445e4847deda951d610abed1daee8 100644 (file)
@@ -39,6 +39,7 @@ public:
   {
     ASSOCIATED_TYPE_BOUNDS,
     INTRINSICS,
+    NEGATIVE_IMPLS,
     RUSTC_ATTRS,
     DECL_MACRO,
     AUTO_TRAITS,
diff --git a/gcc/testsuite/rust/compile/negative_impls.rs b/gcc/testsuite/rust/compile/negative_impls.rs
new file mode 100644 (file)
index 0000000..949a390
--- /dev/null
@@ -0,0 +1,8 @@
+#![feature(negative_impls)]
+
+trait ExampleTrait {}
+
+impl !ExampleTrait for i32 {}
+
+
+fn main() {}
diff --git a/gcc/testsuite/rust/compile/negative_impls_2.rs b/gcc/testsuite/rust/compile/negative_impls_2.rs
new file mode 100644 (file)
index 0000000..d66fbc9
--- /dev/null
@@ -0,0 +1,16 @@
+// This test case should error out since we haven't included the negative_impls feature
+// Output from  online rust compiler 2021 ver
+// Compiling playground v0.0.1 (/playground)
+// error[E0658]: negative trait bounds are not yet fully implemented; use marker types for now
+//  --> src/main.rs:8:6
+//   |
+// 8 | impl !ExampleTrait for i32 {}//
+//   |      ^^^^^^^^^^^^^
+//   |
+//   = note: see issue #68318 <https://github.com/rust-lang/rust/issues/68318> for more information
+
+// For more information about this error, try `rustc --explain E0658`.
+// error: could not compile `playground` (bin "playground") due to 1 previous error
+trait ExampleTrait {}
+
+impl !ExampleTrait for i32 {} // { dg-error "negative_impls are not yet implemented" }
\ No newline at end of file