forked from OSchip/llvm-project
Issue warning when late-parsed attributes have no declaration.
llvm-svn: 151947
This commit is contained in:
parent
653028fe36
commit
71d6103295
|
@ -154,6 +154,9 @@ def err_expected_fn_body : Error<
|
|||
def warn_attribute_on_function_definition : Warning<
|
||||
"GCC does not allow %0 attribute in this position on a function definition">,
|
||||
InGroup<GccCompat>;
|
||||
def warn_attribute_no_decl : Warning<
|
||||
"attribute %0 ignored, because it is not attached to a declaration">,
|
||||
InGroup<IgnoredAttributes>;
|
||||
def err_expected_method_body : Error<"expected method body">;
|
||||
def err_invalid_token_after_toplevel_declarator : Error<
|
||||
"expected ';' after top level declarator">;
|
||||
|
|
|
@ -774,10 +774,6 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
|
|||
ParsedAttributes Attrs(AttrFactory);
|
||||
SourceLocation endLoc;
|
||||
|
||||
// Late parsed attributes must be attached to Decls by hand. If there
|
||||
// are no Decls, then this was not done properly.
|
||||
assert(LA.Decls.size() > 0 && "No decls attached to late parsed attribute");
|
||||
|
||||
if (LA.Decls.size() == 1) {
|
||||
Decl *D = LA.Decls[0];
|
||||
|
||||
|
@ -802,10 +798,12 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
|
|||
if (HasTemplateScope) {
|
||||
TempScope.Exit();
|
||||
}
|
||||
} else {
|
||||
} else if (LA.Decls.size() > 0) {
|
||||
// If there are multiple decls, then the decl cannot be within the
|
||||
// function scope.
|
||||
ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc);
|
||||
} else {
|
||||
Diag(Tok, diag::warn_attribute_no_decl) << LA.AttrName.getName();
|
||||
}
|
||||
|
||||
for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i) {
|
||||
|
|
|
@ -2155,3 +2155,16 @@ private:
|
|||
|
||||
} // end namespace TestMultiDecl
|
||||
|
||||
|
||||
namespace WarnNoDecl {
|
||||
|
||||
class Foo {
|
||||
void foo(int a); __attribute__(( // \
|
||||
// expected-warning {{declaration does not declare anything}}
|
||||
exclusive_locks_required(a))); // \
|
||||
// expected-warning {{attribute exclusive_locks_required ignored}}
|
||||
};
|
||||
|
||||
} // end namespace WarnNoDecl
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue