]> granicus.if.org Git - clang/commitdiff
Skip checking for infinite for-loops if there are global or static variables
authorRichard Trieu <rtrieu@google.com>
Fri, 4 May 2012 03:01:54 +0000 (03:01 +0000)
committerRichard Trieu <rtrieu@google.com>
Fri, 4 May 2012 03:01:54 +0000 (03:01 +0000)
in the conditional.

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

lib/Sema/SemaStmt.cpp
test/SemaCXX/warn-loop-analysis.cpp

index 66ddbaabf1c4d33123cde1de90c358f69c504f89..2d03ab99efcac2d34f7d057f2f73b0c4ef135c8f 100644 (file)
@@ -1214,11 +1214,12 @@ public:
     // No decls found.
     if (Decls.size() == 0) return;
 
-    // Don't warn on volatile decls.
+    // Don't warn on volatile, static, or global variables.
     for (llvm::SmallPtrSet<VarDecl*, 8>::iterator I = Decls.begin(),
                                                   E = Decls.end();
          I != E; ++I)
-      if ((*I)->getType().isVolatileQualified()) return;
+      if ((*I)->getType().isVolatileQualified() ||
+          (*I)->hasGlobalStorage()) return;
 
     if (DeclMatcher(S, Decls, Second).FoundDeclInUse() ||
         DeclMatcher(S, Decls, Third).FoundDeclInUse() ||
index a55ca6c6eace1714e9f8ccd66403d4bd73f74a5b..627bc51d1b0f9d8556f81fd5f0a4c488815b4e15 100644 (file)
@@ -144,3 +144,11 @@ void test5() {
   for (int a; a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a+a;);//\
    // expected-warning {{variable 'a' used in loop condition not modified in loop body}}
 }
+
+// Ignore global variables and static variables.
+int x6;
+void test6() {
+  static int y;
+  for (;x6;);
+  for (;y;);
+}