From 1e10de3ebf3a6c696283a7fed249277740baf04c Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Patry Date: Wed, 1 Oct 2025 12:36:45 +0200 Subject: [PATCH] gccrs: Emit an error on malformed path Path must be made of a single literal item, otherwise an error should be thrown. gcc/rust/ChangeLog: * util/rust-attributes.cc (AttributeChecker::check_attribute): Recurse within attr input for additional attribute checking. (AttributeChecker::visit): Remove empty definition in favor of default ast visitor definition. * util/rust-attributes.h: Remove now unused prototypes. Signed-off-by: Pierre-Emmanuel Patry --- gcc/rust/util/rust-attributes.cc | 35 +++++++++++++++++++++++--------- gcc/rust/util/rust-attributes.h | 2 -- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index bd91fdd5d03..49c4282755c 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -326,6 +326,20 @@ check_proc_macro_non_root (AST::AttrVec attributes, location_t loc) void AttributeChecker::check_attribute (const AST::Attribute &attribute) { + if (!attribute.empty_input ()) + { + 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); + } + } + BuiltinAttrDefinition result; // This checker does not check non-builtin attributes @@ -354,10 +368,6 @@ void AttributeChecker::visit (AST::DelimTokenTree &) {} -void -AttributeChecker::visit (AST::AttrInputMetaItemContainer &) -{} - void AttributeChecker::visit (AST::IdentifierExpr &) {} @@ -421,8 +431,16 @@ AttributeChecker::visit (AST::MetaItemLitExpr &) {} void -AttributeChecker::visit (AST::MetaItemPathExpr &) -{} +AttributeChecker::visit (AST::MetaItemPathExpr &attribute) +{ + if (!attribute.get_expr ().is_literal ()) + { + rust_error_at (attribute.get_locus (), + "malformed % attribute input"); + rust_inform (attribute.get_locus (), + "must be of the form: %<#[path = \"file\"]%>"); + } +} void AttributeChecker::visit (AST::BorrowExpr &) @@ -648,6 +666,7 @@ AttributeChecker::visit (AST::TypeBoundWhereClauseItem &) void AttributeChecker::visit (AST::Module &module) { + check_attributes (module.get_outer_attrs ()); check_proc_macro_non_function (module.get_outer_attrs ()); for (auto &item : module.get_items ()) { @@ -862,10 +881,6 @@ void AttributeChecker::visit (AST::MetaItemPath &) {} -void -AttributeChecker::visit (AST::MetaItemSeq &) -{} - void AttributeChecker::visit (AST::MetaWord &) {} diff --git a/gcc/rust/util/rust-attributes.h b/gcc/rust/util/rust-attributes.h index 22670991beb..0ad3c2b9284 100644 --- a/gcc/rust/util/rust-attributes.h +++ b/gcc/rust/util/rust-attributes.h @@ -112,7 +112,6 @@ private: void visit (AST::Crate &crate) override; void visit (AST::Token &tok) override; void visit (AST::DelimTokenTree &delim_tok_tree) override; - void visit (AST::AttrInputMetaItemContainer &input) override; void visit (AST::IdentifierExpr &ident_expr) override; void visit (AST::Lifetime &lifetime) override; void visit (AST::LifetimeParam &lifetime_param) override; @@ -220,7 +219,6 @@ private: void visit (AST::MacroRulesDefinition &rules_def) override; void visit (AST::MacroInvocation ¯o_invoc) override; void visit (AST::MetaItemPath &meta_item) override; - void visit (AST::MetaItemSeq &meta_item) override; void visit (AST::MetaWord &meta_item) override; void visit (AST::MetaNameValueStr &meta_item) override; void visit (AST::MetaListPaths &meta_item) override; -- 2.47.3