https://gcc.gnu.org/g:5aedc53315387276070e36a5dac4e768f7540cf2
commit r15-8375-g5aedc53315387276070e36a5dac4e768f7540cf2 Author: benjamin.thos <benjamin.t...@epita.fr> Date: Wed Sep 11 14:31:20 2024 +0000 gccrs: Emit error on auto-traits 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.t...@epita.fr> Diff: --- gcc/rust/checks/errors/rust-feature-gate.cc | 9 +++++++++ gcc/rust/checks/errors/rust-feature-gate.h | 1 + gcc/rust/checks/errors/rust-feature.cc | 3 +++ gcc/testsuite/rust/compile/auto_trait.rs | 1 + gcc/testsuite/rust/compile/auto_trait_super_trait.rs | 1 + gcc/testsuite/rust/compile/generic_auto_trait.rs | 1 + 6 files changed, 16 insertions(+) diff --git a/gcc/rust/checks/errors/rust-feature-gate.cc b/gcc/rust/checks/errors/rust-feature-gate.cc index 4ab614e88537..f3daa61f170b 100644 --- a/gcc/rust/checks/errors/rust-feature-gate.cc +++ b/gcc/rust/checks/errors/rust-feature-gate.cc @@ -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) { diff --git a/gcc/rust/checks/errors/rust-feature-gate.h b/gcc/rust/checks/errors/rust-feature-gate.h index 7ffb6ef9d667..f1011e532245 100644 --- a/gcc/rust/checks/errors/rust-feature-gate.h +++ b/gcc/rust/checks/errors/rust-feature-gate.h @@ -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; diff --git a/gcc/rust/checks/errors/rust-feature.cc b/gcc/rust/checks/errors/rust-feature.cc index 6900bb834dbe..25af46cbed81 100644 --- a/gcc/rust/checks/errors/rust-feature.cc +++ b/gcc/rust/checks/errors/rust-feature.cc @@ -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 index 000000000000..47bd119ba36b --- /dev/null +++ b/gcc/testsuite/rust/compile/auto_trait.rs @@ -0,0 +1 @@ +auto trait Valid {} // { dg-error "auto traits are experimental and possibly buggy" } diff --git a/gcc/testsuite/rust/compile/auto_trait_super_trait.rs b/gcc/testsuite/rust/compile/auto_trait_super_trait.rs index 1080afb5124d..06746e914979 100644 --- a/gcc/testsuite/rust/compile/auto_trait_super_trait.rs +++ b/gcc/testsuite/rust/compile/auto_trait_super_trait.rs @@ -1,3 +1,4 @@ +#![feature(optin_builtin_traits)] trait Cold {} auto trait IsCool: Cold {} diff --git a/gcc/testsuite/rust/compile/generic_auto_trait.rs b/gcc/testsuite/rust/compile/generic_auto_trait.rs index ae6a51d0244c..a0a414cdbbd4 100644 --- a/gcc/testsuite/rust/compile/generic_auto_trait.rs +++ b/gcc/testsuite/rust/compile/generic_auto_trait.rs @@ -1,2 +1,3 @@ +#![feature(optin_builtin_traits)] auto trait IsCooler<G> {} // { dg-error "auto traits cannot have generic parameters .E0567." "" { target *-*-* } .-1 }