From: Lucas Ly Ba Date: Wed, 15 Oct 2025 15:28:36 +0000 (+0000) Subject: gccrs: fix inner attr derive doesn't show error X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5c3bc9c08851f52863cf6bd00b263c21da577a39;p=thirdparty%2Fgcc.git gccrs: fix inner attr derive doesn't show error gcc/rust/ChangeLog: * ast/rust-ast.cc (Attribute::is_derive): Change string derive to its definition. * util/rust-attribute-values.h: Add attribute definition derive. * util/rust-attributes.cc (AttributeChecker::visit): Add method check_inner_attributes. (AttributeChecker::check_inner_attributes): Check if there is a bad inner attribute. * util/rust-attributes.h: Add method check_inner_attributes in .h. gcc/testsuite/ChangeLog: * rust/compile/issue-4212.rs: New test. Signed-off-by: Lucas Ly Ba --- diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 4e81de85be4..337a338f9a3 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -248,7 +248,7 @@ Attribute::as_string () const bool Attribute::is_derive () const { - return has_attr_input () && get_path () == "derive"; + return has_attr_input () && get_path () == Values::Attributes::DERIVE; } /** diff --git a/gcc/rust/util/rust-attribute-values.h b/gcc/rust/util/rust-attribute-values.h index 0f35f56f798..a22664a1c48 100644 --- a/gcc/rust/util/rust-attribute-values.h +++ b/gcc/rust/util/rust-attribute-values.h @@ -49,6 +49,8 @@ public: static constexpr auto &PROC_MACRO_DERIVE = "proc_macro_derive"; static constexpr auto &PROC_MACRO_ATTRIBUTE = "proc_macro_attribute"; + static constexpr auto &DERIVE = "derive"; + static constexpr auto &TARGET_FEATURE = "target_feature"; // From now on, these are reserved by the compiler and gated through // #![feature(rustc_attrs)] diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index e4d787794d4..9621100cc95 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -90,6 +90,8 @@ static const BuiltinAttrDefinition __definitions[] {Attrs::PROC_MACRO, EXPANSION}, {Attrs::PROC_MACRO_DERIVE, EXPANSION}, {Attrs::PROC_MACRO_ATTRIBUTE, EXPANSION}, + + {Attrs::DERIVE, EXPANSION}, // FIXME: This is not implemented yet, see // https://github.com/Rust-GCC/gccrs/issues/1475 {Attrs::TARGET_FEATURE, CODE_GENERATION}, @@ -170,6 +172,7 @@ AttributeChecker::go (AST::Crate &crate) void AttributeChecker::visit (AST::Crate &crate) { + check_inner_attributes (crate.get_inner_attrs ()); check_attributes (crate.get_inner_attrs ()); for (auto &item : crate.items) @@ -353,6 +356,15 @@ AttributeChecker::check_attribute (const AST::Attribute &attribute) check_doc_attribute (attribute); } +void +AttributeChecker::check_inner_attributes (const AST::AttrVec &attributes) +{ + for (auto &attr : attributes) + if (attr.is_derive ()) + rust_error_at (attr.get_locus (), + "derive attribute cannot be used at crate level"); +} + void AttributeChecker::check_attributes (const AST::AttrVec &attributes) { diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h index 0ad3c2b9284..b10a0806530 100644 --- a/gcc/rust/util/rust-attributes.h +++ b/gcc/rust/util/rust-attributes.h @@ -106,6 +106,8 @@ private: void check_attribute (const AST::Attribute &attribute); /* Check the validity of all given attributes */ + + void check_inner_attributes (const AST::AttrVec &attributes); void check_attributes (const AST::AttrVec &attributes); // rust-ast.h diff --git a/gcc/testsuite/rust/compile/issue-4212.rs b/gcc/testsuite/rust/compile/issue-4212.rs new file mode 100644 index 00000000000..e068e458c24 --- /dev/null +++ b/gcc/testsuite/rust/compile/issue-4212.rs @@ -0,0 +1,5 @@ +#![derive(PartialOrd, PartialEq)] +// { dg-error "derive attribute cannot be used at crate level" "" { target *-*-* } .-1 } +pub fn check_ge(a: i32, b: i32) -> bool { + a >= b +}