]> granicus.if.org Git - clang/commitdiff
'nonnull(1)' on a block parameter should apply to the block's argument.
authorJordan Rose <jordan_rose@apple.com>
Tue, 11 Feb 2014 17:27:59 +0000 (17:27 +0000)
committerJordan Rose <jordan_rose@apple.com>
Tue, 11 Feb 2014 17:27:59 +0000 (17:27 +0000)
Thanks to r199467, __attribute__((nonnull)) (without arguments) can apply
directly to parameters, instead of being applied to the whole function.
However, the old form of nonnull (with an argument index) could also apply
to the arguments of function and block pointers, and both of these can be
passed as parameters.

Now, if 'nonnull' with an argument is found on a parameter, /and/ the
parameter is a function or block pointer, it is handled the old way.

PR18795

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201162 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclAttr.cpp
test/Sema/nonnull.c
test/SemaObjC/nonnull.m

index 65fb7266dbf01e68b320a87155ce3c97124f2f6b..1bc34aa85f9dbb281381fa17d99df9cd37b2e9f0 100644 (file)
@@ -1170,23 +1170,6 @@ static bool attrNonNullArgCheck(Sema &S, QualType T, const AttributeList &Attr,
   return true;
 }
 
-static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D,
-                                       const AttributeList &Attr) {
-  // Is the argument a pointer type?
-  if (!attrNonNullArgCheck(S, D->getType(), Attr, D->getSourceRange()))
-    return;
-
-  if (Attr.getNumArgs() > 0) {
-    S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_parm_no_args)
-      << D->getSourceRange();
-    return;
-  }
-
-  D->addAttr(::new (S.Context)
-             NonNullAttr(Attr.getRange(), S.Context, 0, 0,
-                         Attr.getAttributeSpellingListIndex()));
-}
-
 static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
   SmallVector<unsigned, 8> NonNullArgs;
   for (unsigned i = 0; i < Attr.getNumArgs(); ++i) {
@@ -1232,6 +1215,27 @@ static void handleNonNullAttr(Sema &S, Decl *D, const AttributeList &Attr) {
                          Attr.getAttributeSpellingListIndex()));
 }
 
+static void handleNonNullAttrParameter(Sema &S, ParmVarDecl *D,
+                                       const AttributeList &Attr) {
+  if (Attr.getNumArgs() > 0) {
+    if (D->getFunctionType()) {
+      handleNonNullAttr(S, D, Attr);
+    } else {
+      S.Diag(Attr.getLoc(), diag::warn_attribute_nonnull_parm_no_args)
+        << D->getSourceRange();
+    }
+    return;
+  }
+
+  // Is the argument a pointer type?
+  if (!attrNonNullArgCheck(S, D->getType(), Attr, D->getSourceRange()))
+    return;
+
+  D->addAttr(::new (S.Context)
+             NonNullAttr(Attr.getRange(), S.Context, 0, 0,
+                         Attr.getAttributeSpellingListIndex()));
+}
+
 static void handleReturnsNonNullAttr(Sema &S, Decl *D,
                                      const AttributeList &Attr) {
   QualType ResultType = getFunctionOrMethodResultType(D);
index 784fd7d08f7b3cb66a633330a16f10cc85e8a28b..0e92654c28328542db7bae82a3e16394558b703c 100644 (file)
@@ -45,3 +45,11 @@ void *test_bad_returns_null(void) {
   return 0; // expected-warning {{null returned from function that requires a non-null return value}}
 }
 
+void PR18795(int (*g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
+  g(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
+}
+void PR18795_helper() {
+  PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
+}
+
+
index 8534fdad6331f7125ae5c2427bca6c5a52fe2830..a345eddbf1e4737b512ba63f4438c521f43f99c2 100644 (file)
@@ -116,3 +116,10 @@ void test(TestNonNullParameters *f) {
   [f doNotPassNullOnMethod:0]; // expected-warning {{null passed to a callee which requires a non-null argument}}
 }
 
+
+void PR18795(int (^g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
+  g(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
+}
+void PR18795_helper() {
+  PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
+}