]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Emit error on auto-traits
authorbenjamin.thos <benjamin.thos@epita.fr>
Wed, 11 Sep 2024 14:31:20 +0000 (14:31 +0000)
committerP-E-P <32375388+P-E-P@users.noreply.github.com>
Wed, 11 Sep 2024 23:03:02 +0000 (23:03 +0000)
Throw an error when auto-traits used without feature attribute.

gcc/rust/ChangeLog:

* checks/errors/rust-feature-gate.cc (FeatureGate::visit): Emit error
on trait when auto field member true.
* checks/errors/rust-feature-gate.h: add prototype of trait visitor.
* checks/errors/rust-feature.cc (Feature::create): add
optin_builtin_traits in match of feature.

gcc/testsuite/ChangeLog:

* rust/compile/auto_trait_super_trait.rs: Add feature attribute.
* rust/compile/generic_auto_trait.rs: likewise.
* rust/compile/auto_trait.rs: add test for error without
feature attribute

Signed-off-by: benjamin.thos <benjamin.thos@epita.fr>
gcc/rust/checks/errors/rust-feature-gate.cc
gcc/rust/checks/errors/rust-feature-gate.h
gcc/rust/checks/errors/rust-feature.cc
gcc/testsuite/rust/compile/auto_trait.rs [new file with mode: 0644]
gcc/testsuite/rust/compile/auto_trait_super_trait.rs
gcc/testsuite/rust/compile/generic_auto_trait.rs

index 2b2c44a8ea8c52dc468d74c55aad2d02fd45407b..5f07d22f1ac1397814faa6690dce3bd6d5c614ad 100644 (file)
@@ -173,6 +173,15 @@ FeatureGate::visit (AST::TraitImpl &impl)
   AST::DefaultASTVisitor::visit (impl);
 }
 
+void
+FeatureGate::visit (AST::Trait &trait)
+{
+  if (trait.is_auto ())
+    gate (Feature::Name::AUTO_TRAITS, trait.get_locus (),
+         "auto traits are experimental and possibly buggy");
+  AST::DefaultASTVisitor::visit (trait);
+}
+
 void
 FeatureGate::visit (AST::BoxExpr &expr)
 {
index f8a9db78d2012581f0bd2da556edcdca1a7b24aa..2d63f4cfdbe1c736a0c0dc0ec6aad3dc0d70d93c 100644 (file)
@@ -42,6 +42,7 @@ public:
   void visit (AST::UseTreeGlob &use_tree) override;
   void visit (AST::Function &function) override;
   void visit (AST::TraitImpl &impl) override;
+  void visit (AST::Trait &trait) override;
   void visit (AST::ExternalTypeItem &item) override;
   void visit (AST::ExternBlock &block) override;
   void visit (AST::MacroRulesDefinition &rules_def) override;
index 3fab5e5aedccae4e4116bcdbc70532e4179c8ae3..04872613d11410af731d911be24d05f88d08c88f 100644 (file)
@@ -55,6 +55,9 @@ Feature::create (Feature::Name f)
                      "1.11.0", 37854);
     case Feature::Name::PRELUDE_IMPORT:
       return Feature (f, Feature::State::ACTIVE, "prelude_import", "1.0.0");
+    case Feature::Name::AUTO_TRAITS:
+      return Feature (f, Feature::State::ACTIVE, "optin_builtin_traits",
+                     "1.0.0", 13231);
     default:
       rust_unreachable ();
     }
diff --git a/gcc/testsuite/rust/compile/auto_trait.rs b/gcc/testsuite/rust/compile/auto_trait.rs
new file mode 100644 (file)
index 0000000..47bd119
--- /dev/null
@@ -0,0 +1 @@
+auto trait Valid {} // { dg-error "auto traits are experimental and possibly buggy" }
index 1080afb5124d3ab77f63f9e3661a78fa96908b96..06746e914979af65ce1ed6dfb775a2791439d830 100644 (file)
@@ -1,3 +1,4 @@
+#![feature(optin_builtin_traits)]
 trait Cold {}
 
 auto trait IsCool: Cold {}
index ae6a51d0244cd09ac05ce5a90e3469263500e8eb..a0a414cdbbd4eb997e445c00d73dbb91f958b215 100644 (file)
@@ -1,2 +1,3 @@
+#![feature(optin_builtin_traits)]
 auto trait IsCooler<G> {}
 // { dg-error "auto traits cannot have generic parameters .E0567." "" { target *-*-* } .-1 }