r199465 - Push NonNullAttr inspection loop into CheckNonNullArguments.

Ted Kremenek kremenek at apple.com
Thu Jan 16 22:24:47 PST 2014


Author: kremenek
Date: Fri Jan 17 00:24:47 2014
New Revision: 199465

URL: http://llvm.org/viewvc/llvm-project?rev=199465&view=rev
Log:
Push NonNullAttr inspection loop into CheckNonNullArguments.

No functionality change.

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=199465&r1=199464&r2=199465&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Fri Jan 17 00:24:47 2014
@@ -713,29 +713,39 @@ bool Sema::getFormatStringInfo(const For
   return true;
 }
 
+static void CheckNonNullArgument(Sema &S,
+                                 const Expr *ArgExpr,
+                                 SourceLocation CallSiteLoc) {
+  // As a special case, transparent unions initialized with zero are
+  // considered null for the purposes of the nonnull attribute.
+  if (const RecordType *UT = ArgExpr->getType()->getAsUnionType()) {
+    if (UT->getDecl()->hasAttr<TransparentUnionAttr>())
+      if (const CompoundLiteralExpr *CLE =
+          dyn_cast<CompoundLiteralExpr>(ArgExpr))
+        if (const InitListExpr *ILE =
+            dyn_cast<InitListExpr>(CLE->getInitializer()))
+          ArgExpr = ILE->getInit(0);
+  }
+
+  bool Result;
+  if (ArgExpr->EvaluateAsBooleanCondition(Result, S.Context) && !Result)
+    S.Diag(CallSiteLoc, diag::warn_null_arg) << ArgExpr->getSourceRange();
+}
+
 static void CheckNonNullArguments(Sema &S,
-                                  const NonNullAttr *NonNull,
+                                  const NamedDecl *FDecl,
                                   const Expr * const *ExprArgs,
                                   SourceLocation CallSiteLoc) {
-  for (NonNullAttr::args_iterator i = NonNull->args_begin(),
-       e = NonNull->args_end();
-       i != e; ++i) {
-    const Expr *ArgExpr = ExprArgs[*i];
-
-    // As a special case, transparent unions initialized with zero are
-    // considered null for the purposes of the nonnull attribute.
-    if (const RecordType *UT = ArgExpr->getType()->getAsUnionType()) {
-      if (UT->getDecl()->hasAttr<TransparentUnionAttr>())
-        if (const CompoundLiteralExpr *CLE =
-            dyn_cast<CompoundLiteralExpr>(ArgExpr))
-          if (const InitListExpr *ILE =
-              dyn_cast<InitListExpr>(CLE->getInitializer()))
-            ArgExpr = ILE->getInit(0);
+  for (specific_attr_iterator<NonNullAttr>
+       I = FDecl->specific_attr_begin<NonNullAttr>(),
+       E = FDecl->specific_attr_end<NonNullAttr>(); I != E; ++I) {
+
+    const NonNullAttr *NonNull = *I;
+    for (NonNullAttr::args_iterator i = NonNull->args_begin(),
+         e = NonNull->args_end();
+         i != e; ++i) {
+      CheckNonNullArgument(S, ExprArgs[*i], CallSiteLoc);
     }
-
-    bool Result;
-    if (ArgExpr->EvaluateAsBooleanCondition(Result, S.Context) && !Result)
-      S.Diag(CallSiteLoc, diag::warn_null_arg) << ArgExpr->getSourceRange();
   }
 }
 
@@ -780,10 +790,7 @@ void Sema::checkCall(NamedDecl *FDecl,
   }
 
   if (FDecl) {
-    for (specific_attr_iterator<NonNullAttr>
-           I = FDecl->specific_attr_begin<NonNullAttr>(),
-           E = FDecl->specific_attr_end<NonNullAttr>(); I != E; ++I)
-      CheckNonNullArguments(*this, *I, Args.data(), Loc);
+    CheckNonNullArguments(*this, FDecl, Args.data(), Loc);
 
     // Type safety checking.
     for (specific_attr_iterator<ArgumentWithTypeTagAttr>





More information about the cfe-commits mailing list