Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gcc/rust/ast/rust-ast.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand Down
2 changes: 0 additions & 2 deletions gcc/rust/util/rust-attribute-values.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,6 @@ class Attributes
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)]
Expand Down
43 changes: 25 additions & 18 deletions gcc/rust/util/rust-attributes.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand All @@ -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},
Expand All @@ -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 ()
{
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
{
Expand Down
8 changes: 5 additions & 3 deletions gcc/rust/util/rust-attributes.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,12 +102,14 @@ class AttributeChecker : public AST::DefaultASTVisitor

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
Expand Down
2 changes: 1 addition & 1 deletion gcc/testsuite/rust/compile/issue-4212.rs
Original file line number Diff line number Diff line change
@@ -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
}
5 changes: 5 additions & 0 deletions gcc/testsuite/rust/compile/issue-4219.rs
Original file line number Diff line number Diff line change
@@ -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
}
Loading