@@ -4584,6 +4584,86 @@ class TestValueFlow : public TestFixture {
4584
4584
ASSERT_EQUALS (true , values.empty ());
4585
4585
values = tokenValues (code, " [ f . b" );
4586
4586
ASSERT_EQUALS (true , values.empty ());
4587
+
4588
+ code = " void f() {\n " // #13109
4589
+ " const int a[10] = {};\n "
4590
+ " for (int n = 0; 1; ++n) {\n "
4591
+ " (void)a[n];\n "
4592
+ " break;\n "
4593
+ " }\n "
4594
+ " }\n " ;
4595
+ values = tokenValues (code, " n ]" );
4596
+ ASSERT_EQUALS (2 , values.size ());
4597
+ auto it = values.begin ();
4598
+ ASSERT_EQUALS (-1 , it->intvalue );
4599
+ ASSERT (it->isImpossible ());
4600
+ ++it;
4601
+ ASSERT_EQUALS (0 , it->intvalue );
4602
+ ASSERT (it->isPossible ());
4603
+
4604
+ code = " void f() {\n "
4605
+ " const int a[10] = {};\n "
4606
+ " for (int n = 0; 1; ++n) {\n "
4607
+ " if (a[n] < 1)\n "
4608
+ " break;\n "
4609
+ " }\n "
4610
+ " }\n " ;
4611
+ values = tokenValues (code, " n ]" );
4612
+ ASSERT_EQUALS (2 , values.size ());
4613
+ it = values.begin ();
4614
+ ASSERT_EQUALS (-1 , it->intvalue );
4615
+ ASSERT (it->isImpossible ());
4616
+ ++it;
4617
+ ASSERT_EQUALS (0 , it->intvalue );
4618
+ ASSERT (it->isPossible ());
4619
+
4620
+ code = " void f() {\n "
4621
+ " const int a[10] = {};\n "
4622
+ " for (int n = 0; 1; ++n) {\n "
4623
+ " if (a[n] < 1)\n "
4624
+ " throw 0;\n "
4625
+ " }\n "
4626
+ " }\n " ;
4627
+ values = tokenValues (code, " n ]" );
4628
+ ASSERT_EQUALS (2 , values.size ());
4629
+ it = values.begin ();
4630
+ ASSERT_EQUALS (-1 , it->intvalue );
4631
+ ASSERT (it->isImpossible ());
4632
+ ++it;
4633
+ ASSERT_EQUALS (0 , it->intvalue );
4634
+ ASSERT (it->isPossible ());
4635
+
4636
+ code = " void f() {\n "
4637
+ " const int a[10] = {};\n "
4638
+ " for (int n = 0; 1; ++n) {\n "
4639
+ " (void)a[n];\n "
4640
+ " exit(1);\n "
4641
+ " }\n "
4642
+ " }\n " ;
4643
+ values = tokenValues (code, " n ]" );
4644
+ ASSERT_EQUALS (2 , values.size ());
4645
+ it = values.begin ();
4646
+ ASSERT_EQUALS (-1 , it->intvalue );
4647
+ ASSERT (it->isImpossible ());
4648
+ ++it;
4649
+ ASSERT_EQUALS (0 , it->intvalue );
4650
+ ASSERT (it->isPossible ());
4651
+
4652
+ code = " void f() {\n "
4653
+ " const int a[10] = {};\n "
4654
+ " for (int n = 0; 1; ++n) {\n "
4655
+ " if (a[n] < 1)\n "
4656
+ " exit(1);\n "
4657
+ " }\n "
4658
+ " }\n " ;
4659
+ values = tokenValues (code, " n ]" );
4660
+ ASSERT_EQUALS (2 , values.size ());
4661
+ it = values.begin ();
4662
+ ASSERT_EQUALS (-1 , it->intvalue );
4663
+ ASSERT (it->isImpossible ());
4664
+ ++it;
4665
+ ASSERT_EQUALS (0 , it->intvalue );
4666
+ ASSERT (it->isPossible ());
4587
4667
}
4588
4668
4589
4669
void valueFlowSubFunction () {
0 commit comments