Skip to content

Commit 72dc99a

Browse files
authored
Token: do not update properties in varid() when the id did not change (#7371)
1 parent 12f1d38 commit 72dc99a

File tree

5 files changed

+45
-2
lines changed

5 files changed

+45
-2
lines changed

lib/token.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ void Token::update_property_info()
126126
tokType(eVariable);
127127
else if (mTokensFrontBack.list.isKeyword(mStr) || mStr == "asm") // TODO: not a keyword
128128
tokType(eKeyword);
129+
// TODO: remove condition? appears to be (no longer necessary) protection for reset of varids in Tokenizer::setVarId()
129130
else if (mTokType != eVariable && mTokType != eFunction && mTokType != eType && mTokType != eKeyword)
130131
tokType(eName);
131132
} else if (simplecpp::Token::isNumberLike(mStr)) {

lib/token.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,9 @@ class CPPCHECKLIB Token {
952952
return mImpl->mVarId;
953953
}
954954
void varId(nonneg int id) {
955+
if (mImpl->mVarId == id)
956+
return;
957+
955958
mImpl->mVarId = id;
956959
if (id != 0) {
957960
tokType(eVariable);

test/fixture.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,13 @@ static std::string writestr(const std::string &str, bool gccStyle = false)
162162
return ostr.str();
163163
}
164164

165-
void TestFixture::assert_(const char * const filename, const unsigned int linenr, const bool condition) const
165+
void TestFixture::assert_(const char * const filename, const unsigned int linenr, const bool condition, const std::string& msg) const
166166
{
167167
if (!condition) {
168168
++fails_counter;
169169
errmsg << getLocationStr(filename, linenr) << ": Assertion failed." << std::endl << "_____" << std::endl;
170+
if (!msg.empty())
171+
errmsg << "Hint:" << std::endl << msg << std::endl;
170172
}
171173
}
172174

test/fixture.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ class TestFixture : public ErrorLogger {
6868
virtual void teardownTestInternal() {}
6969
std::string getLocationStr(const char * filename, unsigned int linenr) const;
7070

71-
void assert_(const char * filename, unsigned int linenr, bool condition) const;
71+
void assert_(const char * filename, unsigned int linenr, bool condition, const std::string& msg = "") const;
7272

7373
template<typename T>
7474
void assertEquals(const char* const filename, const unsigned int linenr, const T& expected, const T& actual, const std::string& msg = "") const {
@@ -313,14 +313,18 @@ class TestInstance {
313313
// TODO: the asserts do not actually assert i.e. do stop executing the test
314314
#define ASSERT( CONDITION ) assert_(__FILE__, __LINE__, (CONDITION))
315315
#define ASSERT_LOC( CONDITION, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION))
316+
#define ASSERT_LOC_MSG( CONDITION, MSG, FILE_, LINE_ ) assert_(FILE_, LINE_, (CONDITION), MSG)
316317
// *INDENT-OFF*
317318
#define ASSERT_EQUALS( EXPECTED, ACTUAL ) do { try { assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL)); } catch (...) { assertNoThrowFail(__FILE__, __LINE__); } } while (false)
318319
// *INDENT-ON*
319320
#define ASSERT_EQUALS_WITHOUT_LINENUMBERS( EXPECTED, ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
320321
#define ASSERT_EQUALS_DOUBLE( EXPECTED, ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
322+
#define ASSERT_EQUALS_LOC( EXPECTED, ACTUAL, FILE_, LINE_ ) assertEquals(FILE_, LINE_, EXPECTED, ACTUAL)
321323
#define ASSERT_EQUALS_LOC_MSG( EXPECTED, ACTUAL, MSG, FILE_, LINE_ ) assertEquals(FILE_, LINE_, EXPECTED, ACTUAL, MSG)
322324
#define ASSERT_EQUALS_MSG( EXPECTED, ACTUAL, MSG ) assertEquals(__FILE__, __LINE__, EXPECTED, ACTUAL, MSG)
323325
#define ASSERT_EQUALS_ENUM( EXPECTED, ACTUAL ) assertEqualsEnum(__FILE__, __LINE__, (EXPECTED), (ACTUAL))
326+
#define ASSERT_EQUALS_ENUM_LOC( EXPECTED, ACTUAL, FILE_, LINE_ ) assertEqualsEnum(FILE_, LINE_, (EXPECTED), (ACTUAL))
327+
#define ASSERT_EQUALS_ENUM_LOC_MSG( EXPECTED, ACTUAL, MSG, FILE_, LINE_ ) assertEqualsEnum(FILE_, LINE_, (EXPECTED), (ACTUAL), MSG)
324328
#define TODO_ASSERT_EQUALS_ENUM( WANTED, CURRENT, ACTUAL ) todoAssertEqualsEnum(__FILE__, __LINE__, WANTED, CURRENT, ACTUAL)
325329
#define ASSERT_THROW_EQUALS( CMD, EXCEPTION, EXPECTED ) do { try { (void)(CMD); assertThrowFail(__FILE__, __LINE__); } catch (const EXCEPTION&e) { assertEquals(__FILE__, __LINE__, EXPECTED, e.errorMessage); } catch (...) { assertThrowFail(__FILE__, __LINE__); } } while (false)
326330
#define ASSERT_THROW_EQUALS_2( CMD, EXCEPTION, EXPECTED ) do { try { (void)(CMD); assertThrowFail(__FILE__, __LINE__); } catch (const EXCEPTION&e) { assertEquals(__FILE__, __LINE__, EXPECTED, e.what()); } catch (...) { assertThrowFail(__FILE__, __LINE__); } } while (false)

test/testtoken.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ class TestToken : public TestFixture {
114114
TEST_CASE(expressionString);
115115

116116
TEST_CASE(hasKnownIntValue);
117+
118+
TEST_CASE(varid_reset);
117119
}
118120

119121
void nextprevious() const {
@@ -1224,6 +1226,37 @@ class TestToken : public TestFixture {
12241226
ASSERT_EQUALS(true, token.addValue(v2));
12251227
ASSERT_EQUALS(false, token.hasKnownIntValue());
12261228
}
1229+
1230+
#define assert_tok(...) _assert_tok(__FILE__, __LINE__, __VA_ARGS__)
1231+
void _assert_tok(const char* file, int line, const Token* tok, Token::Type t, bool l = false, bool std = false, bool ctrl = false) const
1232+
{
1233+
ASSERT_LOC_MSG(tok, "tok", file, line);
1234+
ASSERT_EQUALS_ENUM_LOC_MSG(t, tok->tokType(), "tokType", file, line);
1235+
ASSERT_EQUALS_LOC_MSG(l, tok->isLong(), "isLong", file, line);
1236+
ASSERT_EQUALS_LOC_MSG(std, tok->isStandardType(), "isStandardType", file, line);
1237+
ASSERT_EQUALS_LOC_MSG(ctrl, tok->isControlFlowKeyword(), "isControlFlowKeyword", file, line);
1238+
}
1239+
1240+
void _assert_tok(const char* file, int line, const std::string& s, Token::Type t, bool l = false, bool std = false, bool ctrl = false) const
1241+
{
1242+
TokensFrontBack tokensFrontBack(list);
1243+
Token tok(tokensFrontBack);
1244+
tok.str(s);
1245+
_assert_tok(file, line, &tok, t, l, std, ctrl);
1246+
}
1247+
1248+
void varid_reset() const
1249+
{
1250+
TokenList list_c{&settingsDefault};
1251+
list_c.setLang(Standards::Language::C);
1252+
TokensFrontBack tokensFrontBack(list_c);
1253+
Token tok(tokensFrontBack);
1254+
tok.str("int"); // not treated as keyword in TokenList::isKeyword()
1255+
assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true);
1256+
tok.varId(0);
1257+
assert_tok(&tok, Token::Type::eType, /*l=*/ false, /*std=*/ true);
1258+
}
1259+
#undef assert_tok
12271260
};
12281261

12291262
REGISTER_TEST(TestToken)

0 commit comments

Comments
 (0)