From: Lucas Ly Ba <[email protected]>

gcc/rust/ChangeLog:

        * ast/rust-ast.cc (Attribute::is_derive):
        Change is_derive method with its valid path.
        * util/rust-attribute-values.h:
        Delete redudant derive attribute.
        * util/rust-attributes.cc (AttributeChecker::check_inner_attribute):
        Helper method for check_inner_attributes
        (AttributeChecker::check_inner_attributes):
        Implement method for errors check.
        * util/rust-attributes.h:
        Add methods above in header.

gcc/testsuite/ChangeLog:

        * rust/compile/issue-4212.rs:
        * rust/compile/issue-4219.rs: New test.

Signed-off-by: Lucas Ly Ba <[email protected]>
---
 gcc/rust/ast/rust-ast.cc                 |  2 +-
 gcc/rust/util/rust-attribute-values.h    |  2 --
 gcc/rust/util/rust-attributes.cc         | 43 ++++++++++++++----------
 gcc/rust/util/rust-attributes.h          |  8 +++--
 gcc/testsuite/rust/compile/issue-4212.rs |  2 +-
 gcc/testsuite/rust/compile/issue-4219.rs |  5 +++
 6 files changed, 37 insertions(+), 25 deletions(-)
 create mode 100644 gcc/testsuite/rust/compile/issue-4219.rs

diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc
index 6d37ef7e22f..f3ad2fe5da0 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 () == Values::Attributes::DERIVE;
+  return has_attr_input () && get_path () == Values::Attributes::DERIVE_ATTR;
 }
 
 /**
diff --git a/gcc/rust/util/rust-attribute-values.h 
b/gcc/rust/util/rust-attribute-values.h
index a22664a1c48..0f35f56f798 100644
--- a/gcc/rust/util/rust-attribute-values.h
+++ b/gcc/rust/util/rust-attribute-values.h
@@ -49,8 +49,6 @@ 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 9621100cc95..70f26e7ce36 100644
--- a/gcc/rust/util/rust-attributes.cc
+++ b/gcc/rust/util/rust-attributes.cc
@@ -90,8 +90,6 @@ 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},
@@ -101,7 +99,6 @@ static const BuiltinAttrDefinition __definitions[]
      {Attrs::RUSTC_INHERIT_OVERFLOW_CHECKS, CODE_GENERATION},
      {Attrs::STABLE, STATIC_ANALYSIS},
      {Attrs::UNSTABLE, STATIC_ANALYSIS},
-
      // assuming we keep these for static analysis
      {Attrs::RUSTC_PROMOTABLE, CODE_GENERATION},
      {Attrs::RUSTC_CONST_STABLE, STATIC_ANALYSIS},
@@ -114,23 +111,22 @@ static const BuiltinAttrDefinition __definitions[]
      {Attrs::RUSTC_RESERVATION_IMPL, TYPE_CHECK},
      {Attrs::RUSTC_PAREN_SUGAR, TYPE_CHECK},
      {Attrs::RUSTC_NONNULL_OPTIMIZATION_GUARANTEED, TYPE_CHECK},
-
      {Attrs::RUSTC_LAYOUT_SCALAR_VALID_RANGE_START, CODE_GENERATION},
-
      // TODO: be careful about calling functions marked with this?
      {Attrs::RUSTC_ARGS_REQUIRED_CONST, CODE_GENERATION},
-
      {Attrs::PRELUDE_IMPORT, NAME_RESOLUTION},
-
      {Attrs::RUSTC_DIAGNOSTIC_ITEM, STATIC_ANALYSIS},
      {Attrs::RUSTC_ON_UNIMPLEMENTED, STATIC_ANALYSIS},
-
      {Attrs::FUNDAMENTAL, TYPE_CHECK},
      {Attrs::NON_EXHAUSTIVE, TYPE_CHECK},
      {Attrs::RUSTFMT, EXTERNAL},
-
      {Attrs::TEST, CODE_GENERATION}};
 
+static const std::set<std::string> __outer_attributes
+  = {Attrs::INLINE,        Attrs::DERIVE_ATTR, Attrs::ALLOW_INTERNAL_UNSTABLE,
+     Attrs::LANG,          Attrs::REPR,        Attrs::PATH,
+     Attrs::TARGET_FEATURE, Attrs::TEST};
+
 BuiltinAttributeMappings *
 BuiltinAttributeMappings::get ()
 {
@@ -326,6 +322,26 @@ check_proc_macro_non_root (AST::AttrVec attributes, 
location_t loc)
     }
 }
 
+void
+AttributeChecker::check_inner_attribute (const AST::Attribute &attribute)
+{
+  BuiltinAttrDefinition result;
+
+  if (!is_builtin (attribute, result))
+    return;
+
+  if (__outer_attributes.find (result.name) != __outer_attributes.end ())
+    rust_error_at (attribute.get_locus (),
+                  "attribute cannot be used at crate level");
+}
+
+void
+AttributeChecker::check_inner_attributes (const AST::AttrVec &attributes)
+{
+  for (auto &attr : attributes)
+    check_inner_attribute (attr);
+}
+
 void
 AttributeChecker::check_attribute (const AST::Attribute &attribute)
 {
@@ -356,15 +372,6 @@ 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 b10a0806530..f4a2d389c3d 100644
--- a/gcc/rust/util/rust-attributes.h
+++ b/gcc/rust/util/rust-attributes.h
@@ -102,12 +102,14 @@ public:
 
 private:
   using AST::DefaultASTVisitor::visit;
+
+  /* Check the validity of an inner attribute */
+  void check_inner_attribute (const AST::Attribute &attribute);
+  /* Check the validy of all inner attributes */
+  void check_inner_attributes (const AST::AttrVec &attributes);
   /* Check the validity of a given attribute */
   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
index e068e458c24..e7bf113d7aa 100644
--- a/gcc/testsuite/rust/compile/issue-4212.rs
+++ b/gcc/testsuite/rust/compile/issue-4212.rs
@@ -1,5 +1,5 @@
 #![derive(PartialOrd, PartialEq)]
-// { dg-error "derive attribute cannot be used at crate level" "" { target 
*-*-* } .-1 }
+// { dg-error "attribute cannot be used at crate level" "" { target *-*-* } 
.-1 }
 pub fn check_ge(a: i32, b: i32) -> bool {
     a >= b
 }
diff --git a/gcc/testsuite/rust/compile/issue-4219.rs 
b/gcc/testsuite/rust/compile/issue-4219.rs
new file mode 100644
index 00000000000..d6e70e9a726
--- /dev/null
+++ b/gcc/testsuite/rust/compile/issue-4219.rs
@@ -0,0 +1,5 @@
+#![inline]
+// { dg-error "attribute cannot be used at crate level" "" { target *-*-* } 
.-1 }
+pub fn check_ge(a: i32, b: i32) -> bool {
+    a >= b
+}
-- 
2.50.1

Reply via email to