aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>2023-11-20 14:59:56 +0100
committerP-E-P <32375388+P-E-P@users.noreply.github.com>2023-11-21 11:15:44 +0000
commitb1b0de60cd99742eb71dd909969e128ea0cd94ef (patch)
tree5563ae6000dea2159e8d6a3bb61d8c4d732e041c /gcc
parent1786c4fcb1caea99000c7c874f88688713a6b661 (diff)
downloadgcc-b1b0de60cd99742eb71dd909969e128ea0cd94ef.zip
gcc-b1b0de60cd99742eb71dd909969e128ea0cd94ef.tar.gz
gcc-b1b0de60cd99742eb71dd909969e128ea0cd94ef.tar.bz2
Add check for associated items on auto traits
Reject rust code with associated items on auto traits. gcc/rust/ChangeLog: * checks/errors/rust-ast-validation.cc (ASTValidation::visit): Add auto trait associated item check in AST validation pass. * parse/rust-parse-impl.h: Remove old error emission done during parsing pass. gcc/testsuite/ChangeLog: * rust/compile/auto_trait_invalid.rs: Update old test with updated error message. Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/checks/errors/rust-ast-validation.cc7
-rw-r--r--gcc/rust/parse/rust-parse-impl.h12
-rw-r--r--gcc/testsuite/rust/compile/auto_trait_invalid.rs5
3 files changed, 10 insertions, 14 deletions
diff --git a/gcc/rust/checks/errors/rust-ast-validation.cc b/gcc/rust/checks/errors/rust-ast-validation.cc
index aeae603..6732909 100644
--- a/gcc/rust/checks/errors/rust-ast-validation.cc
+++ b/gcc/rust/checks/errors/rust-ast-validation.cc
@@ -109,6 +109,13 @@ ASTValidation::visit (AST::Trait &trait)
rust_error_at (trait.get_type_param_bounds ()[0]->get_locus (),
ErrorCode::E0568,
"auto traits cannot have super traits");
+ if (trait.has_trait_items ())
+ {
+ rust_error_at (trait.get_identifier ().get_locus (), ErrorCode::E0380,
+ "auto traits cannot have methods or associated items");
+ for (const auto &item : trait.get_trait_items ())
+ Error::Hint (item->get_locus (), "remove this item").emit ();
+ }
}
AST::ContextualASTVisitor::visit (trait);
diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h
index 5a276d1..421b213 100644
--- a/gcc/rust/parse/rust-parse-impl.h
+++ b/gcc/rust/parse/rust-parse-impl.h
@@ -4989,18 +4989,6 @@ Parser<ManagedTokenSource>::parse_trait (AST::Visibility vis,
return nullptr;
}
- if (is_auto_trait && !trait_items.empty ())
- {
- add_error (Error (locus, ErrorCode::E0380,
- "auto traits cannot have associated items"));
-
- // FIXME: unsure if this should be done at parsing time or not
- for (const auto &item : trait_items)
- add_error (Error::Hint (item->get_locus (), "remove this item"));
-
- return nullptr;
- }
-
trait_items.shrink_to_fit ();
return std::unique_ptr<AST::Trait> (
new AST::Trait (std::move (ident), is_unsafe, is_auto_trait,
diff --git a/gcc/testsuite/rust/compile/auto_trait_invalid.rs b/gcc/testsuite/rust/compile/auto_trait_invalid.rs
index 66e4553..3be2acb 100644
--- a/gcc/testsuite/rust/compile/auto_trait_invalid.rs
+++ b/gcc/testsuite/rust/compile/auto_trait_invalid.rs
@@ -2,7 +2,9 @@
#![feature(optin_builtin_traits)]
-unsafe auto trait Invalid { // { dg-error "auto traits cannot have associated items" }
+auto trait Invalid {
+ // { dg-error "auto traits cannot have methods or associated items" "" { target *-*-* } .-1 }
+
fn foo(); // { dg-message "remove this item" }
fn bar() {} // { dg-message "remove this item" }
@@ -13,4 +15,3 @@ unsafe auto trait Invalid { // { dg-error "auto traits cannot have associated it
const BAR: i32 = 15; // { dg-message "remove this item" }
}
-// { dg-error "failed to parse item in crate" "" {target *-*-* } .+1 }