Making some minor improvements to r199626.

llvm-svn: 199663
This commit is contained in:
Aaron Ballman 2014-01-20 14:19:44 +00:00
parent 9e013515aa
commit fc1951c505
3 changed files with 8 additions and 14 deletions

View File

@ -696,7 +696,7 @@ def NonNull : InheritableAttr {
}
def ReturnsNonNull : InheritableAttr {
let Spellings = [GNU<"returns_nonnull">];
let Spellings = [GNU<"returns_nonnull">, CXX11<"gnu", "returns_nonnull">];
let Subjects = SubjectList<[ObjCMethod, HasFunctionProto], WarnDiag,
"ExpectedFunctionOrMethod">;
}

View File

@ -1235,12 +1235,7 @@ static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
static void handleReturnsNonNullAttr(Sema &S, Decl *D,
const AttributeList &Attr) {
QualType ResultType;
if (const FunctionType *Ty = D->getFunctionType())
ResultType = Ty->getResultType();
else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
ResultType = MD->getResultType();
QualType ResultType = getFunctionOrMethodResultType(D);
if (!attrNonNullArgCheck(S, ResultType, Attr, Attr.getRange(),
/* isReturnValue */ true))
return;
@ -3997,9 +3992,8 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
else
handleNonNullAttr(S, D, Attr);
break;
case AttributeList::AT_ReturnsNonNull:
handleReturnsNonNullAttr(S, D, Attr);
break;
case AttributeList::AT_ReturnsNonNull:
handleReturnsNonNullAttr(S, D, Attr); break;
case AttributeList::AT_Overloadable:
handleSimpleAttribute<OverloadableAttr>(S, D, Attr); break;
case AttributeList::AT_Ownership: handleOwnershipAttr (S, D, Attr); break;

View File

@ -32,10 +32,10 @@ void test_baz() {
baz3(0); // no-warning
}
void test_void_returns_nonnull() __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
int test_int_returns_nonnull() __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
void *test_ptr_returns_nonnull() __attribute__((returns_nonnull)); // no-warning
void test_void_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
int test_int_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
void *test_ptr_returns_nonnull(void) __attribute__((returns_nonnull)); // no-warning
int i __attribute__((nonnull)); // expected-warning {{'nonnull' attribute only applies to functions, methods, and parameters}}
int j __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to functions and methods}}
void *test_no_fn_proto() __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to functions and methods}}