@@ -35,12 +35,15 @@ class TestAstUtils : public TestFixture {
3535
3636private:
3737
38+ // TODO: test with C code
39+
3840 void run () override {
3941 TEST_CASE (findLambdaEndTokenTest);
4042 TEST_CASE (findLambdaStartTokenTest);
4143 TEST_CASE (isNullOperandTest);
4244 TEST_CASE (isReturnScopeTest);
43- TEST_CASE (isSameExpressionTest);
45+ TEST_CASE (isSameExpressionCpp);
46+ TEST_CASE (isSameExpressionC);
4447 TEST_CASE (isVariableChangedTest);
4548 TEST_CASE (isVariableChangedByFunctionCallTest);
4649 TEST_CASE (isExpressionChangedTest);
@@ -174,42 +177,53 @@ class TestAstUtils : public TestFixture {
174177 }
175178
176179#define isSameExpression (...) isSameExpression_(__FILE__, __LINE__, __VA_ARGS__)
177- bool isSameExpression_ (const char * file, int line, const char code[], const char tokStr1[], const char tokStr2[]) {
180+ bool isSameExpression_ (const char * file, int line, const char code[], const char tokStr1[], const char tokStr2[], bool cpp ) {
178181 const Settings settings;
179182 Library library;
180183 Tokenizer tokenizer (settings, this );
181184 std::istringstream istr (code);
182- ASSERT_LOC (tokenizer.tokenize (istr, " test.cpp" ), file, line);
185+ ASSERT_LOC (tokenizer.tokenize (istr, cpp ? " test.cpp" : " test.c " ), file, line);
183186 const Token * const tok1 = Token::findsimplematch (tokenizer.tokens (), tokStr1, strlen (tokStr1));
184187 const Token * const tok2 = Token::findsimplematch (tok1->next (), tokStr2, strlen (tokStr2));
185- return (isSameExpression)(false , false , tok1, tok2, library, false , true , nullptr );
188+ return (isSameExpression)(cpp , false , tok1, tok2, library, false , true , nullptr );
186189 }
187190
188- void isSameExpressionTest () {
189- ASSERT_EQUALS (true , isSameExpression (" x = 1 + 1;" , " 1" , " 1" ));
190- ASSERT_EQUALS (false , isSameExpression (" x = 1 + 1u;" , " 1" , " 1u" ));
191- ASSERT_EQUALS (true , isSameExpression (" x = 1.0 + 1.0;" , " 1.0" , " 1.0" ));
192- ASSERT_EQUALS (false , isSameExpression (" x = 1.0f + 1.0;" , " 1.0f" , " 1.0" ));
193- ASSERT_EQUALS (false , isSameExpression (" x = 1L + 1;" , " 1L" , " 1" ));
194- ASSERT_EQUALS (true , isSameExpression (" x = 0.0f + 0x0p+0f;" , " 0.0f" , " 0x0p+0f" ));
195- ASSERT_EQUALS (true , isSameExpression (" x < x;" , " x" , " x" ));
196- ASSERT_EQUALS (false , isSameExpression (" x < y;" , " x" , " y" ));
197- ASSERT_EQUALS (true , isSameExpression (" (x + 1) < (x + 1);" , " +" , " +" ));
198- ASSERT_EQUALS (false , isSameExpression (" (x + 1) < (x + 1L);" , " +" , " +" ));
199- ASSERT_EQUALS (true , isSameExpression (" (1 + x) < (x + 1);" , " +" , " +" ));
200- ASSERT_EQUALS (false , isSameExpression (" (1.0l + x) < (1.0 + x);" , " +" , " +" ));
201- ASSERT_EQUALS (true , isSameExpression (" (0.0 + x) < (x + 0x0p+0);" , " +" , " +" ));
202- ASSERT_EQUALS (true , isSameExpression (" void f() {double y = 1e1; (x + y) < (x + 10.0); } " , " +" , " +" ));
203- ASSERT_EQUALS (true , isSameExpression (" void f() {double y = 1e1; (x + 10.0) < (y + x); } " , " +" , " +" ));
204- ASSERT_EQUALS (true , isSameExpression (" void f() {double y = 1e1; double z = 10.0; (x + y) < (x + z); } " , " +" , " +" ));
205- ASSERT_EQUALS (true , isSameExpression (" A + A" , " A" , " A" ));
191+ void isSameExpressionTestInternal (bool cpp) {
192+ ASSERT_EQUALS (true , isSameExpression (" x = 1 + 1;" , " 1" , " 1" , cpp));
193+ ASSERT_EQUALS (false , isSameExpression (" x = 1 + 1u;" , " 1" , " 1u" , cpp));
194+ ASSERT_EQUALS (true , isSameExpression (" x = 1.0 + 1.0;" , " 1.0" , " 1.0" , cpp));
195+ ASSERT_EQUALS (false , isSameExpression (" x = 1.0f + 1.0;" , " 1.0f" , " 1.0" , cpp));
196+ ASSERT_EQUALS (false , isSameExpression (" x = 1L + 1;" , " 1L" , " 1" , cpp));
197+ ASSERT_EQUALS (true , isSameExpression (" x = 0.0f + 0x0p+0f;" , " 0.0f" , " 0x0p+0f" , cpp));
198+ ASSERT_EQUALS (true , isSameExpression (" x < x;" , " x" , " x" , cpp));
199+ ASSERT_EQUALS (false , isSameExpression (" x < y;" , " x" , " y" , cpp));
200+ ASSERT_EQUALS (true , isSameExpression (" (x + 1) < (x + 1);" , " +" , " +" , cpp));
201+ ASSERT_EQUALS (false , isSameExpression (" (x + 1) < (x + 1L);" , " +" , " +" , cpp));
202+ ASSERT_EQUALS (!cpp, isSameExpression (" (1 + x) < (x + 1);" , " +" , " +" , cpp));
203+ ASSERT_EQUALS (false , isSameExpression (" (1.0l + x) < (1.0 + x);" , " +" , " +" , cpp));
204+ ASSERT_EQUALS (!cpp, isSameExpression (" (0.0 + x) < (x + 0x0p+0);" , " +" , " +" , cpp));
205+ ASSERT_EQUALS (true , isSameExpression (" void f() {double y = 1e1; (x + y) < (x + 10.0); } " , " +" , " +" , cpp));
206+ ASSERT_EQUALS (!cpp, isSameExpression (" void f() {double y = 1e1; (x + 10.0) < (y + x); } " , " +" , " +" , cpp));
207+ ASSERT_EQUALS (true , isSameExpression (" void f() {double y = 1e1; double z = 10.0; (x + y) < (x + z); } " , " +" , " +" , cpp));
208+ ASSERT_EQUALS (true , isSameExpression (" A + A" , " A" , " A" , cpp));
209+
210+ // the remaining test cases are not valid C code
211+ if (!cpp)
212+ return ;
206213
207214 // https://trac.cppcheck.net/ticket/9700
208- ASSERT_EQUALS (true , isSameExpression (" A::B + A::B;" , " ::" , " ::" ));
209- ASSERT_EQUALS (false , isSameExpression (" A::B + A::C;" , " ::" , " ::" ));
210- ASSERT_EQUALS (true , isSameExpression (" A::B* get() { if(x) return new A::B(true); else return new A::B(true); }" , " new" , " new" ));
211- ASSERT_EQUALS (false , isSameExpression (" A::B* get() { if(x) return new A::B(true); else return new A::C(true); }" , " new" , " new" ));
212- ASSERT_EQUALS (true , true );
215+ ASSERT_EQUALS (true , isSameExpression (" A::B + A::B;" , " ::" , " ::" , cpp));
216+ ASSERT_EQUALS (false , isSameExpression (" A::B + A::C;" , " ::" , " ::" , cpp));
217+ ASSERT_EQUALS (true , isSameExpression (" A::B* get() { if(x) return new A::B(true); else return new A::B(true); }" , " new" , " new" , cpp));
218+ ASSERT_EQUALS (false , isSameExpression (" A::B* get() { if(x) return new A::B(true); else return new A::C(true); }" , " new" , " new" , cpp));
219+ }
220+
221+ void isSameExpressionCpp () {
222+ isSameExpressionTestInternal (true );
223+ }
224+
225+ void isSameExpressionC () {
226+ isSameExpressionTestInternal (false );
213227 }
214228
215229#define isVariableChanged (code, startPattern, endPattern ) isVariableChanged_(code, startPattern, endPattern, __FILE__, __LINE__)
@@ -220,7 +234,7 @@ class TestAstUtils : public TestFixture {
220234 ASSERT_LOC (tokenizer.tokenize (istr, " test.cpp" ), file, line);
221235 const Token * const tok1 = Token::findsimplematch (tokenizer.tokens (), startPattern, strlen (startPattern));
222236 const Token * const tok2 = Token::findsimplematch (tokenizer.tokens (), endPattern, strlen (endPattern));
223- return (isVariableChanged)(tok1, tok2, 1 , false , &settings, true );
237+ return (isVariableChanged)(tok1, tok2, 1 , false , &settings, /* cpp */ true );
224238 }
225239
226240 void isVariableChangedTest () {
@@ -399,7 +413,7 @@ class TestAstUtils : public TestFixture {
399413 const Token* const start = Token::findsimplematch (tokenizer.tokens (), startPattern, strlen (startPattern));
400414 const Token* const end = Token::findsimplematch (start, endPattern, strlen (endPattern));
401415 const Token* const expr = Token::findsimplematch (tokenizer.tokens (), var, strlen (var));
402- return (findExpressionChanged)(expr, start, end, &settings, true );
416+ return (findExpressionChanged)(expr, start, end, &settings, /* cpp */ true );
403417 }
404418
405419 void isExpressionChangedTest ()
0 commit comments