Issue warning when late-parsed attributes have no declaration.

llvm-svn: 151947
This commit is contained in:
DeLesley Hutchins 2012-03-02 22:29:50 +00:00
parent 653028fe36
commit 71d6103295
3 changed files with 19 additions and 5 deletions

View File

@ -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">;

View File

@ -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) {

View File

@ -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