Skip to content

Commit 29d6307

Browse files
committed
fixed #13743 - FP AssignmentAddressToInteger for double cast
1 parent 31a5db8 commit 29d6307

File tree

4 files changed

+25
-21
lines changed

4 files changed

+25
-21
lines changed

lib/token.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,7 @@ void Token::update_property_info()
134134
else if (mStr == "asm") { // TODO: not a keyword
135135
tokType(eKeyword);
136136
}
137-
// TODO: remove condition? appears to be (no longer necessary) protection for reset of varids in Tokenizer::setVarId()
138-
else if (mTokType != eVariable && mTokType != eFunction && mTokType != eType && mTokType != eKeyword) {
137+
else {
139138
tokType(eName);
140139
// some types are not being treated as keywords
141140
update_property_isStandardType();
@@ -183,8 +182,7 @@ void Token::update_property_info()
183182
} else {
184183
tokType(eNone);
185184
}
186-
// TODO: make sure varid is only set for eVariable
187-
//assert(!mImpl->mVarId || mTokType == eVariable);
185+
assert(!mImpl->mVarId || mTokType == eVariable);
188186
// TODO: validate type for linked token?
189187
}
190188

lib/token.h

+1-9
Original file line numberDiff line numberDiff line change
@@ -956,15 +956,7 @@ class CPPCHECKLIB Token {
956956
return;
957957

958958
mImpl->mVarId = id;
959-
// TODO: remove special handling?
960-
if (id != 0) {
961-
tokType(eVariable);
962-
isStandardType(false);
963-
// TODO: clear fIsLong
964-
// TODO: clear fIsControlFlowKeyword
965-
} else {
966-
update_property_info();
967-
}
959+
update_property_info();
968960
}
969961

970962
nonneg int exprId() const {

lib/tokenize.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -3543,6 +3543,7 @@ void Tokenizer::combineOperators()
35433543
}
35443544
if (simplify) {
35453545
tok->str(tok->str() + ":");
3546+
tok->tokType(Token::Type::eKeyword); // we need to preserve the keyword type after setting a non-keyword string
35463547
tok->deleteNext();
35473548
}
35483549
} else if (tok->str() == "->") {
@@ -10278,6 +10279,8 @@ void Tokenizer::simplifyOperatorName()
1027810279
for (Token *tok = list.front(); tok; tok = tok->next()) {
1027910280
if (Token::Match(tok, "using|:: operator %op%|%name% ;")) {
1028010281
tok->next()->str("operator" + tok->strAt(2));
10282+
tok->next()->tokType(Token::Type::eKeyword); // we need to preserve the keyword type after setting a non-keyword string
10283+
// TODO: tok->next()->isOperatorKeyword(true);
1028110284
tok->next()->deleteNext();
1028210285
continue;
1028310286
}
@@ -10287,6 +10290,8 @@ void Tokenizer::simplifyOperatorName()
1028710290
// operator op
1028810291
if (Token::Match(tok, "operator %op% (") && !operatorEnd(tok->linkAt(2))) {
1028910292
tok->str(tok->str() + tok->strAt(1));
10293+
tok->tokType(Token::Type::eKeyword); // we need to preserve the keyword type after setting a non-keyword string
10294+
// TODO: tok->isOperatorKeyword(true);
1029010295
tok->deleteNext();
1029110296
continue;
1029210297
}
@@ -10359,11 +10364,15 @@ void Tokenizer::simplifyOperatorName()
1035910364
const bool returnsRef = Token::simpleMatch(par, "( & (") && tok->next()->isName();
1036010365
if (par && !op.empty()) {
1036110366
if (returnsRef) {
10362-
par->next()->insertToken("operator" + op)->isOperatorKeyword(true);
10367+
Token* tok_op = par->next()->insertToken("operator" + op);
10368+
// TODO: tok_op->tokType(Token::Type::eKeyword); // the given token is not a keyword but should be treated as such
10369+
tok_op->isOperatorKeyword(true);
1036310370
tok->deleteThis();
1036410371
}
1036510372
else {
1036610373
tok->str("operator" + op);
10374+
tok->tokType(Token::Type::eKeyword); // we need to preserve the keyword type after setting a non-keyword string
10375+
// TODO: tok->isOperatorKeyword(true);
1036710376
Token::eraseTokens(tok, par);
1036810377
}
1036910378
}

test/testtoken.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ class TestToken : public TestFixture {
123123
TEST_CASE(update_property_info_ecomparisonop_link);
124124
TEST_CASE(update_property_info_etype_c);
125125
TEST_CASE(update_property_info_etype_cpp);
126+
TEST_CASE(update_property_info_replace);
127+
126128
TEST_CASE(varid_reset);
127129
}
128130

@@ -1341,13 +1343,6 @@ class TestToken : public TestFixture {
13411343
tok.varId(17);
13421344
assert_tok(&tok, Token::Type::eVariable);
13431345
}
1344-
{
1345-
TokensFrontBack tokensFrontBack(list);
1346-
Token tok(tokensFrontBack);
1347-
tok.varId(17);
1348-
tok.str("var1");
1349-
assert_tok(&tok, Token::Type::eVariable);
1350-
}
13511346
}
13521347

13531348
void update_property_info_ekeyword_c() const
@@ -1496,6 +1491,16 @@ class TestToken : public TestFixture {
14961491
}
14971492
}
14981493

1494+
void update_property_info_replace() const
1495+
{
1496+
TokensFrontBack tokensFrontBack(list);
1497+
Token tok(tokensFrontBack);
1498+
tok.str("size_t");
1499+
assert_tok(&tok, Token::Type::eType, false, true);
1500+
tok.str("long");
1501+
assert_tok(&tok, Token::Type::eType, false, true);
1502+
}
1503+
14991504
void varid_reset() const
15001505
{
15011506
TokenList list_c{&settingsDefault};

0 commit comments

Comments
 (0)