diff options
author | Richard Trieu <rtrieu@google.com> | 2012-05-04 03:01:54 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2012-05-04 03:01:54 +0000 |
commit | 9087599e5ee64ecd30194b3d89f8748ac95c62f7 (patch) | |
tree | f7ce65f2f3b97e8b4f08d2d20db1d417b794d050 | |
parent | b88acb018a0d5e897ce291da2664edfd7bd58f5c (diff) |
Skip checking for infinite for-loops if there are global or static variables
in the conditional.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156148 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 5 | ||||
-rw-r--r-- | test/SemaCXX/warn-loop-analysis.cpp | 8 |
2 files changed, 11 insertions, 2 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 66ddbaabf1..2d03ab99ef 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -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() || diff --git a/test/SemaCXX/warn-loop-analysis.cpp b/test/SemaCXX/warn-loop-analysis.cpp index a55ca6c6ea..627bc51d1b 100644 --- a/test/SemaCXX/warn-loop-analysis.cpp +++ b/test/SemaCXX/warn-loop-analysis.cpp @@ -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;); +} |