]> granicus.if.org Git - clang/commitdiff
Making some minor improvements to r199626.
authorAaron Ballman <aaron@aaronballman.com>
Mon, 20 Jan 2014 14:19:44 +0000 (14:19 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Mon, 20 Jan 2014 14:19:44 +0000 (14:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199663 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/Attr.td
lib/Sema/SemaDeclAttr.cpp
test/Sema/nonnull.c

index f1eb97ea77bf5d5ce70fb259170d9dc9066303a0..5ea3915ccfad1ee34efb8da1e6e3e547ace7ba85 100644 (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">;
 }
index ed8610cec39e1a6cc196aead3fe00ff0520eee28..65b3820a0b4a2d40372e0a4c8bb5b35409699afc 100644 (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;
index f1ba482453f27dba2a6f235a60b479aca52ed17a..9ec004fdde5747cf0080a444556e7d73d624c98f 100644 (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}}