https://gcc.gnu.org/g:5c3bc9c08851f52863cf6bd00b263c21da577a39

commit r16-4893-g5c3bc9c08851f52863cf6bd00b263c21da577a39
Author: Lucas Ly Ba <[email protected]>
Date:   Wed Oct 15 15:28:36 2025 +0000

    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 <[email protected]>

Diff:
---
 gcc/rust/ast/rust-ast.cc                 |  2 +-
 gcc/rust/util/rust-attribute-values.h    |  2 ++
 gcc/rust/util/rust-attributes.cc         | 12 ++++++++++++
 gcc/rust/util/rust-attributes.h          |  2 ++
 gcc/testsuite/rust/compile/issue-4212.rs |  5 +++++
 5 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 4e81de85be42..337a338f9a39 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 0f35f56f798e..a22664a1c48f 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 e4d787794d4b..9621100cc952 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 0ad3c2b92848..b10a0806530b 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 000000000000..e068e458c24f
--- /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
+}

Reply via email to