@@ -4584,6 +4584,86 @@ class TestValueFlow : public TestFixture {
45844584 ASSERT_EQUALS (true , values.empty ());
45854585 values = tokenValues (code, " [ f . b" );
45864586 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 ());
45874667 }
45884668
45894669 void valueFlowSubFunction () {
0 commit comments