<div dir="ltr"><span style="color:rgb(0,0,0);font-family:"Segoe UI","Segoe UI Emoji","Segoe UI Symbol",Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;text-align:left;text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">This commit seems to have introduced<span> </span></span><a href="https://bugs.llvm.org/show_bug.cgi?id=37769" class="gmail-remarkup-link" target="_blank" rel="noreferrer" style="text-decoration:none;color:rgb(19,108,178);margin-top:0px;font-family:"Segoe UI","Segoe UI Emoji","Segoe UI Symbol",Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;text-align:left">https://bugs.llvm.org/show_bug.cgi?id=37769</a><span style="color:rgb(0,0,0);font-family:"Segoe UI","Segoe UI Emoji","Segoe UI Symbol",Lato,"Helvetica Neue",Helvetica,Arial,sans-serif;text-align:left;text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">. Could you take a look?</span></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Apr 20, 2018 at 1:33 AM Artem Dergachev via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dergachev<br>
Date: Thu Apr 19 16:30:15 2018<br>
New Revision: 330382<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=330382&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=330382&view=rev</a><br>
Log:<br>
[CFG] [analyzer] Add construction contexts for loop condition variables.<br>
<br>
Loop condition variables, eg.<br>
<br>
  while (shared_ptr<int> P = getIntPtr()) { ... })<br>
<br>
weren't handled in r324794 because they don't go through the common<br>
CFGBuilder::VisitDeclStmt method. Which means that they regressed<br>
after r324800.<br>
<br>
Fix the regression by duplicating the necessary construction context scan in<br>
the loop visiting code.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D45706" rel="noreferrer" target="_blank">https://reviews.llvm.org/D45706</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Analysis/CFG.cpp<br>
    cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp<br>
    cfe/trunk/test/Analysis/cfg-rich-constructors.cpp<br>
    cfe/trunk/test/Analysis/scopes-cfg-output.cpp<br>
<br>
Modified: cfe/trunk/lib/Analysis/CFG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=330382&r1=330381&r2=330382&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=330382&r1=330381&r2=330382&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/CFG.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/CFG.cpp Thu Apr 19 16:30:15 2018<br>
@@ -3169,7 +3169,13 @@ CFGBlock *CFGBuilder::VisitForStmt(ForSt<br>
       if (VarDecl *VD = F->getConditionVariable()) {<br>
         if (Expr *Init = VD->getInit()) {<br>
           autoCreateBlock();<br>
-          appendStmt(Block, F->getConditionVariableDeclStmt());<br>
+          const DeclStmt *DS = F->getConditionVariableDeclStmt();<br>
+          assert(DS->isSingleDecl());<br>
+          findConstructionContexts(<br>
+              ConstructionContextLayer::create(cfg->getBumpVectorContext(),<br>
+                                               const_cast<DeclStmt *>(DS)),<br>
+              Init);<br>
+          appendStmt(Block, DS);<br>
           EntryConditionBlock = addStmt(Init);<br>
           assert(Block == EntryConditionBlock);<br>
           maybeAddScopeBeginForVarDecl(EntryConditionBlock, VD, C);<br>
@@ -3494,7 +3500,13 @@ CFGBlock *CFGBuilder::VisitWhileStmt(Whi<br>
     if (VarDecl *VD = W->getConditionVariable()) {<br>
       if (Expr *Init = VD->getInit()) {<br>
         autoCreateBlock();<br>
-        appendStmt(Block, W->getConditionVariableDeclStmt());<br>
+        const DeclStmt *DS = W->getConditionVariableDeclStmt();<br>
+        assert(DS->isSingleDecl());<br>
+        findConstructionContexts(<br>
+            ConstructionContextLayer::create(cfg->getBumpVectorContext(),<br>
+                                             const_cast<DeclStmt *>(DS)),<br>
+            Init);<br>
+        appendStmt(Block, DS);<br>
         EntryConditionBlock = addStmt(Init);<br>
         assert(Block == EntryConditionBlock);<br>
         maybeAddScopeBeginForVarDecl(EntryConditionBlock, VD, C);<br>
<br>
Modified: cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp?rev=330382&r1=330381&r2=330382&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp?rev=330382&r1=330381&r2=330382&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp (original)<br>
+++ cfe/trunk/test/Analysis/auto-obj-dtors-cfg-output.cpp Thu Apr 19 16:30:15 2018<br>
@@ -388,7 +388,8 @@ void test_if_jumps() {<br>
 // CHECK:      [B4]<br>
 // CHECK-NEXT:   1: a<br>
 // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   3: [B4.2] (CXXConstructExpr, class A)<br>
+// WARNINGS-NEXT:   3: [B4.2] (CXXConstructExpr, class A)<br>
+// ANALYZER-NEXT:   3: [B4.2] (CXXConstructExpr, [B4.4], class A)<br>
 // CHECK-NEXT:   4: A b = a;<br>
 // CHECK-NEXT:   5: b<br>
 // CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -478,7 +479,8 @@ void test_while_implicit_scope() {<br>
 // CHECK:      [B10]<br>
 // CHECK-NEXT:   1: a<br>
 // CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   3: [B10.2] (CXXConstructExpr, class A)<br>
+// WARNINGS-NEXT:   3: [B10.2] (CXXConstructExpr, class A)<br>
+// ANALYZER-NEXT:   3: [B10.2] (CXXConstructExpr, [B10.4], class A)<br>
 // CHECK-NEXT:   4: A b = a;<br>
 // CHECK-NEXT:   5: b<br>
 // CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -761,7 +763,8 @@ void test_switch_jumps() {<br>
 // CHECK:      [B4]<br>
 // CHECK-NEXT:   1: a<br>
 // CHECK-NEXT:   2: [B4.1] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   3: [B4.2] (CXXConstructExpr, class A)<br>
+// WARNINGS-NEXT:   3: [B4.2] (CXXConstructExpr, class A)<br>
+// ANALYZER-NEXT:   3: [B4.2] (CXXConstructExpr, [B4.4], class A)<br>
 // CHECK-NEXT:   4: A b = a;<br>
 // CHECK-NEXT:   5: b<br>
 // CHECK-NEXT:   6: [B4.5] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -851,7 +854,8 @@ void test_for_implicit_scope() {<br>
 // CHECK:      [B10]<br>
 // CHECK-NEXT:   1: b<br>
 // CHECK-NEXT:   2: [B10.1] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   3: [B10.2] (CXXConstructExpr, class A)<br>
+// WARNINGS-NEXT:   3: [B10.2] (CXXConstructExpr, class A)<br>
+// ANALYZER-NEXT:   3: [B10.2] (CXXConstructExpr, [B10.4], class A)<br>
 // CHECK-NEXT:   4: A c = b;<br>
 // CHECK-NEXT:   5: c<br>
 // CHECK-NEXT:   6: [B10.5] (ImplicitCastExpr, NoOp, const class A)<br>
<br>
Modified: cfe/trunk/test/Analysis/cfg-rich-constructors.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cfg-rich-constructors.cpp?rev=330382&r1=330381&r2=330382&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/cfg-rich-constructors.cpp?rev=330382&r1=330381&r2=330382&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Analysis/cfg-rich-constructors.cpp (original)<br>
+++ cfe/trunk/test/Analysis/cfg-rich-constructors.cpp Thu Apr 19 16:30:15 2018<br>
@@ -450,6 +450,85 @@ void temporaryInCondition() {<br>
   if (C());<br>
 }<br>
<br>
+// CHECK: void temporaryInConditionVariable()<br>
+// CHECK:          1: C() (CXXConstructExpr, [B2.2], class C)<br>
+// CXX11-NEXT:     2: [B2.1]<br>
+// CXX11-NEXT:     3: [B2.2] (CXXConstructExpr, [B2.4], class C)<br>
+// CXX11-NEXT:     4: C c = C();<br>
+// CXX11-NEXT:     5: c<br>
+// CXX11-NEXT:     6: [B2.5] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX11-NEXT:     7: [B2.6].operator bool<br>
+// CXX11-NEXT:     8: [B2.6]<br>
+// CXX11-NEXT:     9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX11-NEXT:     T: if [B2.9]<br>
+// CXX17-NEXT:     2: C c = C();<br>
+// CXX17-NEXT:     3: c<br>
+// CXX17-NEXT:     4: [B2.3] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX17-NEXT:     5: [B2.4].operator bool<br>
+// CXX17-NEXT:     6: [B2.4]<br>
+// CXX17-NEXT:     7: [B2.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX17-NEXT:     T: if [B2.7]<br>
+void temporaryInConditionVariable() {<br>
+  if (C c = C());<br>
+}<br>
+<br>
+<br>
+// CHECK: void temporaryInForLoopConditionVariable()<br>
+// CHECK:        [B2]<br>
+// CXX11-NEXT:     1: C() (CXXConstructExpr, [B2.2], class C)<br>
+// CXX11-NEXT:     2: [B2.1]<br>
+// CXX11-NEXT:     3: [B2.2] (CXXConstructExpr, [B2.4], class C)<br>
+// CXX11-NEXT:     4: C c2 = C();<br>
+// CXX11-NEXT:     5: c2<br>
+// CXX11-NEXT:     6: [B2.5] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX11-NEXT:     7: [B2.6].operator bool<br>
+// CXX11-NEXT:     8: [B2.6]<br>
+// CXX11-NEXT:     9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX11-NEXT:     T: for (...; [B2.9]; )<br>
+// CXX17-NEXT:     1: C() (CXXConstructExpr, [B2.2], class C)<br>
+// CXX17-NEXT:     2: C c2 = C();<br>
+// CXX17-NEXT:     3: c2<br>
+// CXX17-NEXT:     4: [B2.3] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX17-NEXT:     5: [B2.4].operator bool<br>
+// CXX17-NEXT:     6: [B2.4]<br>
+// CXX17-NEXT:     7: [B2.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX17-NEXT:     T: for (...; [B2.7]; )<br>
+// CHECK:        [B3]<br>
+// CXX11-NEXT:     1: C() (CXXConstructExpr, [B3.2], class C)<br>
+// CXX11-NEXT:     2: [B3.1]<br>
+// CXX11-NEXT:     3: [B3.2] (CXXConstructExpr, [B3.4], class C)<br>
+// CXX11-NEXT:     4: C c1 = C();<br>
+// CXX17-NEXT:     1: C() (CXXConstructExpr, [B3.2], class C)<br>
+// CXX17-NEXT:     2: C c1 = C();<br>
+void temporaryInForLoopConditionVariable() {<br>
+  for (C c1 = C(); C c2 = C(); );<br>
+}<br>
+<br>
+<br>
+// FIXME: Find construction context for the loop condition variable.<br>
+// CHECK: void temporaryInWhileLoopConditionVariable()<br>
+// CXX11:          1: C() (CXXConstructExpr, [B2.2], class C)<br>
+// CXX11-NEXT:     2: [B2.1]<br>
+// CXX11-NEXT:     3: [B2.2] (CXXConstructExpr, [B2.4], class C)<br>
+// CXX11-NEXT:     4: C c = C();<br>
+// CXX11-NEXT:     5: c<br>
+// CXX11-NEXT:     6: [B2.5] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX11-NEXT:     7: [B2.6].operator bool<br>
+// CXX11-NEXT:     8: [B2.6]<br>
+// CXX11-NEXT:     9: [B2.8] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX11-NEXT:     T: while [B2.9]<br>
+// CXX17:          1: C() (CXXConstructExpr, [B2.2], class C)<br>
+// CXX17-NEXT:     2: C c = C();<br>
+// CXX17-NEXT:     3: c<br>
+// CXX17-NEXT:     4: [B2.3] (ImplicitCastExpr, NoOp, const class C)<br>
+// CXX17-NEXT:     5: [B2.4].operator bool<br>
+// CXX17-NEXT:     6: [B2.4]<br>
+// CXX17-NEXT:     7: [B2.6] (ImplicitCastExpr, UserDefinedConversion, _Bool)<br>
+// CXX17-NEXT:     T: while [B2.7]<br>
+void temporaryInWhileLoopConditionVariable() {<br>
+  while (C c = C());<br>
+}<br>
+<br>
 } // end namespace temporary_object_expr_without_dtors<br>
<br>
 namespace temporary_object_expr_with_dtors {<br>
<br>
Modified: cfe/trunk/test/Analysis/scopes-cfg-output.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/scopes-cfg-output.cpp?rev=330382&r1=330381&r2=330382&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/scopes-cfg-output.cpp?rev=330382&r1=330381&r2=330382&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Analysis/scopes-cfg-output.cpp (original)<br>
+++ cfe/trunk/test/Analysis/scopes-cfg-output.cpp Thu Apr 19 16:30:15 2018<br>
@@ -296,7 +296,7 @@ void test_if_jumps() {<br>
 // CHECK-NEXT:   1: CFGScopeBegin(b)<br>
 // CHECK-NEXT:   2: a<br>
 // CHECK-NEXT:   3: [B4.2] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, class A)<br>
+// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, [B4.5], class A)<br>
 // CHECK-NEXT:   5: A b = a;<br>
 // CHECK-NEXT:   6: b<br>
 // CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -395,7 +395,7 @@ void test_while_implicit_scope() {<br>
 // CHECK-NEXT:   1: CFGScopeBegin(b)<br>
 // CHECK-NEXT:   2: a<br>
 // CHECK-NEXT:   3: [B10.2] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, class A)<br>
+// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, [B10.5], class A)<br>
 // CHECK-NEXT:   5: A b = a;<br>
 // CHECK-NEXT:   6: b<br>
 // CHECK-NEXT:   7: [B10.6] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -540,7 +540,7 @@ void test_do_jumps() {<br>
 // CHECK-NEXT:   1: CFGScopeBegin(b)<br>
 // CHECK-NEXT:   2: a<br>
 // CHECK-NEXT:   3: [B4.2] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, class A)<br>
+// CHECK-NEXT:   4: [B4.3] (CXXConstructExpr, [B4.5], class A)<br>
 // CHECK-NEXT:   5: A b = a;<br>
 // CHECK-NEXT:   6: b<br>
 // CHECK-NEXT:   7: [B4.6] (ImplicitCastExpr, NoOp, const class A)<br>
@@ -640,7 +640,7 @@ void test_for_implicit_scope() {<br>
 // CHECK-NEXT:   1: CFGScopeBegin(c)<br>
 // CHECK-NEXT:   2: b<br>
 // CHECK-NEXT:   3: [B10.2] (ImplicitCastExpr, NoOp, const class A)<br>
-// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, class A)<br>
+// CHECK-NEXT:   4: [B10.3] (CXXConstructExpr, [B10.5], class A)<br>
 // CHECK-NEXT:   5: A c = b;<br>
 // CHECK-NEXT:   6: c<br>
 // CHECK-NEXT:   7: [B10.6] (ImplicitCastExpr, NoOp, const class A)<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>