]> granicus.if.org Git - clang/commitdiff
Make -Wfor-loop-analysis work with C++17
authorRichard Trieu <rtrieu@google.com>
Sat, 20 Oct 2018 02:15:58 +0000 (02:15 +0000)
committerRichard Trieu <rtrieu@google.com>
Sat, 20 Oct 2018 02:15:58 +0000 (02:15 +0000)
For now, disable the "variable in loop condition not modified" warning to not
be emitted when there is a structured binding variable in the loop condition.

https://bugs.llvm.org/show_bug.cgi?id=39285

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

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

index f0d19475827230803a4211e6bc03d3cea8f74b36..16ed9ed767cf89b285fb29169662b4c2baeba6db 100644 (file)
@@ -1409,7 +1409,11 @@ namespace {
 
     void VisitDeclRefExpr(DeclRefExpr *E) {
       VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
-      if (!VD) return;
+      if (!VD) {
+        // Don't allow unhandled Decl types.
+        Simple = false;
+        return;
+      }
 
       Ranges.push_back(E->getSourceRange());
 
index 2934003848a28bb0fe99f5fa65cacde497f933ea..324dd386292acd6af56e363c2089f988fdabd6d4 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -fsyntax-only -Wloop-analysis -verify %s
+// RUN: %clang_cc1 -fsyntax-only -Wloop-analysis -verify -std=c++17 %s
 
 struct S {
   bool stop() { return false; }
@@ -278,3 +278,24 @@ void test9() {
   // Don't warn when variable is defined by the loop condition.
   for (int i = 0; int x = f(i); ++i) {}
 }
+
+// Don't warn when decomposition variables are in the loop condition.
+// TODO: BindingDecl's which make a copy should warn.
+void test10() {
+  int arr[] = {1, 2, 3};
+  for (auto[i, j, k] = arr;;) { }
+  for (auto[i, j, k] = arr; i < j; ++i, ++j) { }
+
+  for (auto[i, j, k] = arr; i;) { }
+  for (auto[i, j, k] = arr; i < j;) { }
+  for (auto[i, j, k] = arr; i < j; ++arr[0]) { }
+
+  int a = 1, b = 2;
+  for (auto[i, j, k] = arr; a < b;) { }  // expected-warning{{variables 'a' and 'b' used in loop condition not modified in loop body}}
+  for (auto[i, j, k] = arr; a < b; ++a) { }
+
+  for (auto [i, j, k] = arr; i < a;) { }
+  for (auto[i, j, k] = arr; i < a; ++a) { }
+  for (auto[i, j, k] = arr; i < a; ++i) { }
+  for (auto[i, j, k] = arr; i < a; ++arr[0]) { }
+};