]> granicus.if.org Git - clang/commitdiff
When checking for nonnull parameter attributes, also check the ParmVarDecl since...
authorAaron Ballman <aaron@aaronballman.com>
Thu, 11 Dec 2014 19:35:42 +0000 (19:35 +0000)
committerAaron Ballman <aaron@aaronballman.com>
Thu, 11 Dec 2014 19:35:42 +0000 (19:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224039 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
lib/Sema/SemaExpr.cpp
test/Sema/nonnull.c

index 8e5592564f532d8da96e3ef6472871cc5f852a16..57fc14e786c79495397795ce5ee0bac9f26a8d7d 100644 (file)
@@ -6766,7 +6766,8 @@ void Sema::DiagnoseAlwaysNonNullPointer(Expr *E,
         }
         if (!AttrNonNull.empty())
           for (unsigned i = 0; i < NumArgs; ++i)
-            if (FD->getParamDecl(i) == PV && AttrNonNull[i]) {
+            if (FD->getParamDecl(i) == PV &&
+                (AttrNonNull[i] || PV->hasAttr<NonNullAttr>())) {
               std::string Str;
               llvm::raw_string_ostream S(Str);
               E->printPretty(S, nullptr, getPrintingPolicy());
index 76e3612327469189c3b87cf14ef8730b8afa28e4..c04b99d464c34f36e688afb555cb3bf4121b9f9f 100644 (file)
@@ -9243,7 +9243,7 @@ static void RecordModifiableNonNullParam(Sema &S, const Expr *Exp) {
   if (!Param)
     return;
   if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(Param->getDeclContext()))
-    if (!FD->hasAttr<NonNullAttr>())
+    if (!FD->hasAttr<NonNullAttr>() && !Param->hasAttr<NonNullAttr>())
       return;
   if (FunctionScopeInfo *FD = S.getCurFunction())
     if (!FD->ModifiedNonNullParams.count(Param))
index de47e9664ca10276dc97df28a5fa262d6cebc029..4b3df8518cfc111f37e000e069b2b59d2aa0a5b7 100644 (file)
@@ -141,3 +141,15 @@ void yet_another_evil_nonnull_func(int* pointer)
  }
 }
 
+void pr21668_1(__attribute__((nonnull)) const char *p, const char *s) {
+  if (p) // expected-warning {{nonnull parameter 'p' will evaluate to 'true' on first encounter}}
+    ;
+  if (s) // No warning
+    ;
+}
+
+void pr21668_2(__attribute__((nonnull)) const char *p) {
+  p = 0;
+  if (p) // No warning
+    ;
+}