diff --git a/gcc/rust/ast/rust-ast.cc b/gcc/rust/ast/rust-ast.cc index 228cacbe52e..d9a383675cf 100644 --- a/gcc/rust/ast/rust-ast.cc +++ b/gcc/rust/ast/rust-ast.cc @@ -4200,10 +4200,8 @@ MetaListNameValueStr::to_attribute () const Attribute MetaItemPathExpr::to_attribute () const { - rust_assert (expr->is_literal ()); - auto &lit = static_cast (*expr); - return Attribute (path, std::unique_ptr ( - new AttrInputLiteral (lit))); + auto input = std::make_unique (expr->clone_expr ()); + return Attribute (path, std::move (input)); } std::vector @@ -4219,13 +4217,9 @@ AttrInputMetaItemContainer::separate_cfg_attrs () const for (auto it = items.begin () + 1; it != items.end (); ++it) { - if ((*it)->get_kind () == MetaItemInner::Kind::MetaItem - && static_cast (**it).get_item_kind () - == MetaItem::ItemKind::PathExpr - && !static_cast (**it).get_expr ().is_literal ()) - continue; + auto &item = **it; - Attribute attr = (*it)->to_attribute (); + Attribute attr = item.to_attribute (); if (attr.is_empty ()) { /* TODO should this be an error that causes us to chuck out diff --git a/gcc/rust/expand/rust-cfg-strip.cc b/gcc/rust/expand/rust-cfg-strip.cc index 59cec98af6c..2e6971e63f3 100644 --- a/gcc/rust/expand/rust-cfg-strip.cc +++ b/gcc/rust/expand/rust-cfg-strip.cc @@ -93,6 +93,9 @@ expand_cfg_attrs (AST::AttrVec &attrs) if (attr.check_cfg_predicate (session)) { + // Key has been found we need to remove the conditional part of + // the attribute and insert the content back + // split off cfg_attr AST::AttrVec new_attrs = attr.separate_cfg_attrs (); @@ -110,6 +113,12 @@ expand_cfg_attrs (AST::AttrVec &attrs) */ i--; } + else + { + // Key has not been found, remove the whole attribute + attrs.erase (attrs.begin () + i); + i--; + } /* do something - if feature (first token in tree) is in fact enabled, * make tokens listed afterwards into attributes. i.e.: for diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index bf2762f68da..d246cc67211 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -553,34 +553,28 @@ check_lint_attribute (const AST::Attribute &attribute, const char *name) void AttributeChecker::visit (AST::Attribute &attribute) { - if (!attribute.empty_input ()) + auto &session = Session::get_instance (); + if (attribute.get_path () == Values::Attributes::CFG_ATTR) { - const auto &attr_input = attribute.get_attr_input (); - auto type = attr_input.get_attr_input_type (); - if (type == AST::AttrInput::AttrInputType::TOKEN_TREE) - { - const auto &option = static_cast ( - attribute.get_attr_input ()); - std::unique_ptr meta_item ( - option.parse_to_meta_item ()); - AST::DefaultASTVisitor::visit (meta_item); - } + if (!attribute.is_parsed_to_meta_item ()) + attribute.parse_attr_to_meta_item (); + if (!attribute.check_cfg_predicate (session)) + return; // Do not emit errors for attribute that'll get stripped. } - auto result_opt = identify_builtin (attribute); + if (auto builtin = identify_builtin (attribute)) + { + auto result = builtin.value (); + // TODO: Add checks here for each builtin attribute + // TODO: Have an enum of builtins as well, switching on strings is + // annoying and costly + if (result.name == Attrs::DOC) + check_doc_attribute (attribute); + else if (result.name == Attrs::DEPRECATED) + check_deprecated_attribute (attribute); + } - // This checker does not check non-builtin attributes - if (!result_opt.has_value ()) - return; - auto result = result_opt.value (); - - // TODO: Add checks here for each builtin attribute - // TODO: Have an enum of builtins as well, switching on strings is annoying - // and costly - if (result.name == Attrs::DOC) - check_doc_attribute (attribute); - else if (result.name == Attrs::DEPRECATED) - check_deprecated_attribute (attribute); + AST::DefaultASTVisitor::visit (attribute); } void diff --git a/gcc/testsuite/rust/compile/attr_malformed_path.rs b/gcc/testsuite/rust/compile/attr_malformed_path.rs index 024a8363e12..56ed4a4e9d2 100644 --- a/gcc/testsuite/rust/compile/attr_malformed_path.rs +++ b/gcc/testsuite/rust/compile/attr_malformed_path.rs @@ -3,4 +3,6 @@ #[cfg_attr(target_arch = "x86_64", path = (target_arch = "x86", path = "x86.rs"))] mod imp {} -// { dg-error "malformed .path. attribute input" "" { target *-*-* } .-2 } +// { dg-error "malformed .path. attribute input" "" { target { x86_64-*-* && { lp64 } } } .-2 } +// { dg-error "cannot find value .target_arch. in this scope" "" { target { x86_64-*-* && { lp64 } } } .-3 } +// { dg-error "cannot find value .path. in this scope" "" { target { x86_64-*-* && { lp64 } } } .-4 }