================
@@ -1710,4 +1710,25 @@ TEST_F(TopTest, ForRangeStmtConverges) {
                 // analysis converged.
               });
 }
+
+TEST_F(TopTest, ForRangeStmtHasFlowCondition) {
+  std::string Code = R"(
+    #include <array>
+    void target(bool Foo) {
+      std::array<int, 5> t;
+      for (auto& i : t) {
+        (void)0;
+        /*[[p1]]*/
+      }
+    }
+  )";
+  runDataflow(Code,
+              [](const llvm::StringMap<DataflowAnalysisState<NoopLattice>> 
&Results,
+                 const AnalysisOutputs &AO) {
+                  ASSERT_THAT(Results.keys(), UnorderedElementsAre("p1"));
+                  const Environment &Env1 = 
getEnvironmentAtAnnotation(Results, "p1");
+                  
ASSERT_TRUE(Env1.proves(Env1.arena().makeAtomRef(Env1.getFlowConditionToken())));
+              });
+}
----------------
martinboehme wrote:

See comments above -- I'm not sure that the test, if it fails, means that we 
need a flow condition for the range-based for. (User code will never be able to 
"observe" this flow condition, so I'm not sure why we need it.)

I still don't understand what the underlying purpose is that you need this flow 
condition for in the iterator check. Can you expand? (I want to make sure we're 
not dealing with an [XY problem](https://en.wikipedia.org/wiki/XY_problem).)

https://github.com/llvm/llvm-project/pull/80989
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to