Skip to content

Commit b7a43ff

Browse files
TestAstUtils: fixed consistency of language being used in isSameExpressionTest / added a few language checks (#5728)
For the `isSameExpression()` test we were tokenizing the code as C++ but were treating it as C later on. --------- Co-authored-by: chrchr-github <78114321+chrchr-github@users.noreply.github.com>
1 parent e0769ab commit b7a43ff

File tree

2 files changed

+47
-33
lines changed

2 files changed

+47
-33
lines changed

lib/astutils.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3105,7 +3105,7 @@ bool isIteratorPair(const std::vector<const Token*>& args)
31053105

31063106
const Token *findLambdaStartToken(const Token *last)
31073107
{
3108-
if (!last || last->str() != "}")
3108+
if (!last || !last->isCpp() || last->str() != "}")
31093109
return nullptr;
31103110
const Token* tok = last->link();
31113111
if (Token::simpleMatch(tok->astParent(), "("))
@@ -3115,7 +3115,7 @@ const Token *findLambdaStartToken(const Token *last)
31153115
return nullptr;
31163116
}
31173117

3118-
template<class T>
3118+
template<class T, REQUIRES("T must be a Token class", std::is_convertible<T*, const Token*> )>
31193119
static T* findLambdaEndTokenGeneric(T* first)
31203120
{
31213121
auto maybeLambda = [](T* tok) -> bool {
@@ -3133,7 +3133,7 @@ static T* findLambdaEndTokenGeneric(T* first)
31333133
return true;
31343134
};
31353135

3136-
if (!first || first->str() != "[")
3136+
if (!first || !first->isCpp() || first->str() != "[")
31373137
return nullptr;
31383138
if (!maybeLambda(first->previous()))
31393139
return nullptr;
@@ -3447,7 +3447,7 @@ bool isNullOperand(const Token *expr)
34473447
{
34483448
if (!expr)
34493449
return false;
3450-
if (Token::Match(expr, "static_cast|const_cast|dynamic_cast|reinterpret_cast <"))
3450+
if (expr->isCpp() && Token::Match(expr, "static_cast|const_cast|dynamic_cast|reinterpret_cast <"))
34513451
expr = expr->astParent();
34523452
else if (!expr->isCast())
34533453
return Token::Match(expr, "NULL|nullptr");

test/testastutils.cpp

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ class TestAstUtils : public TestFixture {
3535

3636
private:
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

Comments
 (0)