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