Skip to content

Commit 9d21379

Browse files
authored
Add non-const overloads for next(), previous(), and link() (#5002)
* Add non-const overloads for next(), previous(), and link() * Format * Add CPPCHECKLIB
1 parent d5fbd55 commit 9d21379

9 files changed

Lines changed: 70 additions & 54 deletions

File tree

lib/astutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ CPPCHECKLIB const Token *findLambdaStartToken(const Token *last);
392392
* \return nullptr or the }
393393
*/
394394
CPPCHECKLIB const Token *findLambdaEndToken(const Token *first);
395-
Token* findLambdaEndToken(Token* first);
395+
CPPCHECKLIB Token* findLambdaEndToken(Token* first);
396396

397397
bool isLikelyStream(bool cpp, const Token *stream);
398398

lib/symboldatabase.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
#include <unordered_set>
5353
//---------------------------------------------------------------------------
5454

55-
SymbolDatabase::SymbolDatabase(const Tokenizer &tokenizer, const Settings &settings, ErrorLogger *errorLogger)
55+
SymbolDatabase::SymbolDatabase(Tokenizer& tokenizer, const Settings& settings, ErrorLogger* errorLogger)
5656
: mTokenizer(tokenizer), mSettings(settings), mErrorLogger(errorLogger)
5757
{
5858
if (!mTokenizer.tokens())
@@ -1230,7 +1230,7 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12301230
};
12311231

12321232
// Set variable pointers
1233-
for (const Token* tok = mTokenizer.list.front(); tok != mTokenizer.list.back(); tok = tok->next()) {
1233+
for (Token* tok = mTokenizer.list.front(); tok != mTokenizer.list.back(); tok = tok->next()) {
12341234
if (!tok->isName() || tok->isKeyword() || tok->isStandardType())
12351235
continue;
12361236
if (tok->varId())

lib/symboldatabase.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,17 +1364,17 @@ class CPPCHECKLIB ValueType {
13641364
class CPPCHECKLIB SymbolDatabase {
13651365
friend class TestSymbolDatabase;
13661366
public:
1367-
SymbolDatabase(const Tokenizer &tokenizer, const Settings &settings, ErrorLogger *errorLogger);
1367+
SymbolDatabase(Tokenizer& tokenizer, const Settings& settings, ErrorLogger* errorLogger);
13681368
~SymbolDatabase();
13691369

13701370
/** @brief Information about all namespaces/classes/structures */
13711371
std::list<Scope> scopeList;
13721372

13731373
/** @brief Fast access to function scopes */
1374-
std::vector<const Scope *> functionScopes;
1374+
std::vector<const Scope*> functionScopes;
13751375

13761376
/** @brief Fast access to class and struct scopes */
1377-
std::vector<const Scope *> classAndStructScopes;
1377+
std::vector<const Scope*> classAndStructScopes;
13781378

13791379
/** @brief Fast access to types */
13801380
std::list<Type> typeList;
@@ -1385,21 +1385,22 @@ class CPPCHECKLIB SymbolDatabase {
13851385
* @param typeTok token containing variable type
13861386
* @return pointer to type if found or NULL if not found
13871387
*/
1388-
const Type *findVariableType(const Scope *start, const Token *typeTok) const;
1388+
const Type* findVariableType(const Scope* start, const Token* typeTok) const;
13891389

13901390
/**
13911391
* @brief find a function
13921392
* @param tok token of function call
13931393
* @return pointer to function if found or NULL if not found
13941394
*/
1395-
const Function *findFunction(const Token *tok) const;
1395+
const Function* findFunction(const Token* tok) const;
13961396

13971397
/** For unit testing only */
1398-
const Scope *findScopeByName(const std::string& name) const;
1398+
const Scope* findScopeByName(const std::string& name) const;
13991399

1400-
const Type* findType(const Token *startTok, const Scope *startScope, bool lookOutside = false) const;
1401-
Type* findType(const Token *startTok, Scope *startScope, bool lookOutside = false) {
1402-
return const_cast<Type*>(this->findType(startTok, const_cast<const Scope *>(startScope), lookOutside));
1400+
const Type* findType(const Token* startTok, const Scope* startScope, bool lookOutside = false) const;
1401+
Type* findType(const Token* startTok, Scope* startScope, bool lookOutside = false)
1402+
{
1403+
return const_cast<Type*>(this->findType(startTok, const_cast<const Scope*>(startScope), lookOutside));
14031404
}
14041405

14051406
const Scope *findScope(const Token *tok, const Scope *startScope) const;
@@ -1508,7 +1509,7 @@ class CPPCHECKLIB SymbolDatabase {
15081509
void setValueType(Token* tok, const Variable& var, SourceLocation loc = SourceLocation::current());
15091510
void setValueType(Token* tok, const Enumerator& enumerator, SourceLocation loc = SourceLocation::current());
15101511

1511-
const Tokenizer &mTokenizer;
1512+
Tokenizer& mTokenizer;
15121513
const Settings &mSettings;
15131514
ErrorLogger *mErrorLogger;
15141515

lib/token.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -830,10 +830,13 @@ class CPPCHECKLIB Token {
830830
mImpl->mColumn = c;
831831
}
832832

833-
Token *next() const {
833+
Token* next() {
834834
return mNext;
835835
}
836836

837+
const Token* next() const {
838+
return mNext;
839+
}
837840

838841
/**
839842
* Delete tokens between begin and end. E.g. if begin = 1
@@ -859,10 +862,13 @@ class CPPCHECKLIB Token {
859862
return insertToken(tokenStr, originalNameStr, true);
860863
}
861864

862-
Token *previous() const {
865+
Token* previous() {
863866
return mPrevious;
864867
}
865868

869+
const Token* previous() const {
870+
return mPrevious;
871+
}
866872

867873
nonneg int varId() const {
868874
return mImpl->mVarId;
@@ -1012,7 +1018,11 @@ class CPPCHECKLIB Token {
10121018
*
10131019
* @return The token where this token links to.
10141020
*/
1015-
Token *link() const {
1021+
const Token* link() const {
1022+
return mLink;
1023+
}
1024+
1025+
Token* link() {
10161026
return mLink;
10171027
}
10181028

lib/tokenize.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2603,7 +2603,7 @@ namespace {
26032603
// fixme: this is wrong
26042604
// skip to end of scope
26052605
if (currentScope->bodyEnd)
2606-
*tok = currentScope->bodyEnd->previous();
2606+
*tok = const_cast<Token*>(currentScope->bodyEnd->previous());
26072607
return false;
26082608
}
26092609

@@ -2938,7 +2938,7 @@ bool Tokenizer::simplifyUsing()
29382938
if (!currentScope1)
29392939
return substitute; // something bad happened
29402940
startToken = usingEnd->next();
2941-
endToken = currentScope->bodyEnd->next();
2941+
endToken = const_cast<Token*>(currentScope->bodyEnd->next());
29422942
if (currentScope->type == ScopeInfo3::MemberFunction) {
29432943
const ScopeInfo3 * temp = currentScope->findScope(currentScope->fullName);
29442944
if (temp) {
@@ -4037,10 +4037,9 @@ void VariableMap::addVariable(const std::string& varname, bool globalNamespace)
40374037
it->second = ++mVarId;
40384038
}
40394039

4040-
4041-
static bool setVarIdParseDeclaration(const Token **tok, const VariableMap& variableMap, bool executableScope, bool cpp, bool c)
4040+
static bool setVarIdParseDeclaration(Token** tok, const VariableMap& variableMap, bool executableScope, bool cpp, bool c)
40424041
{
4043-
const Token *tok2 = *tok;
4042+
Token* tok2 = *tok;
40444043
if (!tok2->isName())
40454044
return false;
40464045

@@ -4079,7 +4078,7 @@ static bool setVarIdParseDeclaration(const Token **tok, const VariableMap& varia
40794078
const Token *start = *tok;
40804079
if (Token::Match(start->previous(), "%or%|%oror%|&&|&|^|+|-|*|/"))
40814080
return false;
4082-
const Token * const closingBracket = tok2->findClosingBracket();
4081+
Token* const closingBracket = tok2->findClosingBracket();
40834082
if (closingBracket == nullptr) { /* Ticket #8151 */
40844083
throw tok2;
40854084
}
@@ -4232,14 +4231,13 @@ void Tokenizer::setVarIdStructMembers(Token **tok1,
42324231
*tok1 = tok;
42334232
}
42344233

4235-
4236-
void Tokenizer::setVarIdClassDeclaration(const Token * const startToken,
4237-
VariableMap &variableMap,
4234+
void Tokenizer::setVarIdClassDeclaration(Token* const startToken,
4235+
VariableMap& variableMap,
42384236
const nonneg int scopeStartVarId,
42394237
std::map<nonneg int, std::map<std::string, nonneg int>>& structMembers)
42404238
{
42414239
// end of scope
4242-
const Token * const endToken = startToken->link();
4240+
Token* const endToken = startToken->link();
42434241

42444242
// determine class name
42454243
std::string className;
@@ -4516,7 +4514,7 @@ void Tokenizer::setVarIdPass1()
45164514
return;
45174515

45184516
// locate the variable name..
4519-
const Token *tok2 = (tok->isName()) ? tok : tok->next();
4517+
Token* tok2 = (tok->isName()) ? tok : tok->next();
45204518

45214519
// private: protected: public: etc
45224520
while (tok2 && endsWith(tok2->str(), ':')) {

lib/tokenize.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -579,8 +579,8 @@ class CPPCHECKLIB Tokenizer {
579579

580580
void unsupportedTypedef(const Token *tok) const;
581581

582-
void setVarIdClassDeclaration(const Token * const startToken, // cppcheck-suppress functionConst // has side effects
583-
VariableMap &variableMap,
582+
void setVarIdClassDeclaration(Token* const startToken, // cppcheck-suppress functionConst // has side effects
583+
VariableMap& variableMap,
584584
const nonneg int scopeStartVarId,
585585
std::map<nonneg int, std::map<std::string, nonneg int>>& structMembers);
586586

@@ -645,6 +645,10 @@ class CPPCHECKLIB Tokenizer {
645645
return list.front();
646646
}
647647

648+
Token* tokens() {
649+
return list.front();
650+
}
651+
648652
/**
649653
* Helper function to check whether number is one (1 or 0.1E+1 or 1E+0) or not?
650654
* @param s the string to check

lib/tokenlist.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ static void compilePrecedence2(Token *&tok, AST_state& state)
943943
}
944944
}
945945

946-
const Token* const tok2 = tok;
946+
Token* const tok2 = tok;
947947
if (tok->strAt(1) != "]")
948948
compileBinOp(tok, state, compileExpression);
949949
else
@@ -1414,7 +1414,7 @@ static Token * createAstAtToken(Token *tok, bool cpp)
14141414
{
14151415
// skip function pointer declaration
14161416
if (Token::Match(tok, "%type%") && !Token::Match(tok, "return|throw|if|while|new|delete")) {
1417-
const Token* type = tok;
1417+
Token* type = tok;
14181418
while (Token::Match(type, "%type%|*|&|<")) {
14191419
if (type->str() == "<") {
14201420
if (type->link())
@@ -1640,7 +1640,7 @@ static Token * createAstAtToken(Token *tok, bool cpp)
16401640
Token * const tok1 = tok;
16411641
AST_state state(cpp);
16421642
compileExpression(tok, state);
1643-
const Token * const endToken = tok;
1643+
Token* const endToken = tok;
16441644
if (endToken == tok1 || !endToken)
16451645
return tok1;
16461646

lib/valueflow.cpp

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,7 @@ static void valueFlowEnumValue(SymbolDatabase * symboldatabase, const Settings *
19331933

19341934
for (Enumerator & enumerator : scope.enumeratorList) {
19351935
if (enumerator.start) {
1936-
Token *rhs = enumerator.start->previous()->astOperand2();
1936+
Token* rhs = const_cast<Token*>(enumerator.start->previous()->astOperand2());
19371937
ValueFlow::valueFlowConstantFoldAST(rhs, settings);
19381938
if (rhs && rhs->hasKnownIntValue()) {
19391939
enumerator.value = rhs->values().front().intvalue;
@@ -5189,10 +5189,10 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
51895189
}
51905190
}
51915191

5192-
for (const Token* tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) {
5192+
for (Token* tok = const_cast<Token*>(scope->bodyStart); tok != scope->bodyEnd; tok = tok->next()) {
51935193
if (!Token::simpleMatch(tok, "if ("))
51945194
continue;
5195-
const Token * parenTok = tok->next();
5195+
Token* parenTok = tok->next();
51965196
if (!Token::simpleMatch(parenTok->link(), ") {"))
51975197
continue;
51985198
Token * blockTok = parenTok->link()->tokAt(1);
@@ -5255,7 +5255,6 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
52555255
}
52565256
}
52575257
}
5258-
52595258
}
52605259
}
52615260
}
@@ -6150,7 +6149,7 @@ struct ConditionHandler {
61506149
if (tok->hasKnownIntValue())
61516150
return;
61526151

6153-
const Token* top = tok->astTop();
6152+
Token* top = tok->astTop();
61546153

61556154
if (Token::Match(top, "%assign%"))
61566155
return;
@@ -6291,7 +6290,7 @@ struct ConditionHandler {
62916290
const Settings* settings,
62926291
const std::set<const Scope*>& skippedFunctions) const {
62936292
traverseCondition(tokenlist, symboldatabase, settings, skippedFunctions, [&](const Condition& cond, Token* condTok, const Scope* scope) {
6294-
const Token* top = condTok->astTop();
6293+
Token* top = condTok->astTop();
62956294

62966295
const MathLib::bigint path = cond.getPath();
62976296
const bool allowKnown = path == 0;
@@ -7507,7 +7506,7 @@ static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldat
75077506
const Function* function = scope->function;
75087507
if (!function)
75097508
continue;
7510-
for (const Token *tok = scope->bodyStart; tok != scope->bodyEnd; tok = tok->next()) {
7509+
for (Token* tok = const_cast<Token*>(scope->bodyStart); tok != scope->bodyEnd; tok = tok->next()) {
75117510
if (tok->isKeyword() || !Token::Match(tok, "%name% ("))
75127511
continue;
75137512

@@ -8296,8 +8295,8 @@ static void valueFlowIterators(TokenList *tokenlist, const Settings *settings)
82968295
continue;
82978296
if (!astIsContainer(tok))
82988297
continue;
8299-
const Token* ftok = nullptr;
8300-
const Library::Container::Yield yield = findIteratorYield(tok, &ftok, settings);
8298+
Token* ftok = nullptr;
8299+
const Library::Container::Yield yield = findIteratorYield(tok, const_cast<const Token**>(&ftok), settings);
83018300
if (ftok) {
83028301
ValueFlow::Value v(0);
83038302
v.setKnown();
@@ -8573,39 +8572,39 @@ static void valueFlowContainerSize(TokenList* tokenlist,
85738572
}
85748573
if (!staticSize && nonLocal)
85758574
continue;
8576-
if (var->nameToken()->hasKnownValue(ValueFlow::Value::ValueType::CONTAINER_SIZE))
8575+
Token* nameToken = const_cast<Token*>(var->nameToken());
8576+
if (nameToken->hasKnownValue(ValueFlow::Value::ValueType::CONTAINER_SIZE))
85778577
continue;
85788578
if (!staticSize) {
8579-
if (!Token::Match(var->nameToken(), "%name% ;") &&
8580-
!(Token::Match(var->nameToken(), "%name% {") &&
8581-
Token::simpleMatch(var->nameToken()->next()->link(), "} ;")) &&
8582-
!Token::Match(var->nameToken(), "%name% ("))
8579+
if (!Token::Match(nameToken, "%name% ;") &&
8580+
!(Token::Match(nameToken, "%name% {") && Token::simpleMatch(nameToken->next()->link(), "} ;")) &&
8581+
!Token::Match(nameToken, "%name% ("))
85838582
continue;
85848583
}
8585-
if (var->nameToken()->astTop() && Token::Match(var->nameToken()->astTop()->previous(), "for|while"))
8584+
if (nameToken->astTop() && Token::Match(nameToken->astTop()->previous(), "for|while"))
85868585
known = !isVariableChanged(var, settings, true);
85878586
std::vector<ValueFlow::Value> values{ValueFlow::Value{size}};
85888587
values.back().valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE;
85898588
if (known)
85908589
values.back().setKnown();
85918590
if (!staticSize) {
8592-
if (Token::simpleMatch(var->nameToken()->next(), "{")) {
8593-
Token* initList = var->nameToken()->next();
8594-
valueFlowContainerSetTokValue(tokenlist, settings, var->nameToken(), initList);
8591+
if (Token::simpleMatch(nameToken->next(), "{")) {
8592+
Token* initList = nameToken->next();
8593+
valueFlowContainerSetTokValue(tokenlist, settings, nameToken, initList);
85958594
values = getInitListSize(initList, var->valueType(), settings, known);
8596-
} else if (Token::simpleMatch(var->nameToken()->next(), "(")) {
8597-
const Token* constructorArgs = var->nameToken()->next();
8595+
} else if (Token::simpleMatch(nameToken->next(), "(")) {
8596+
const Token* constructorArgs = nameToken->next();
85988597
values = getContainerSizeFromConstructor(constructorArgs, var->valueType(), settings, known);
85998598
}
86008599
}
86018600

86028601
if (constSize) {
8603-
valueFlowForwardConst(var->nameToken()->next(), var->scope()->bodyEnd, var, values, settings);
8602+
valueFlowForwardConst(nameToken->next(), var->scope()->bodyEnd, var, values, settings);
86048603
continue;
86058604
}
86068605

86078606
for (const ValueFlow::Value& value : values) {
8608-
valueFlowForward(var->nameToken()->next(), var->nameToken(), value, tokenlist, settings);
8607+
valueFlowForward(nameToken->next(), var->nameToken(), value, tokenlist, settings);
86098608
}
86108609
}
86118610

test/helpers.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ class givenACodeSampleToTokenize {
4545
tokenizer.tokenize(iss, cpp ? "test.cpp" : "test.c");
4646
}
4747

48+
Token* tokens() {
49+
return tokenizer.tokens();
50+
}
51+
4852
const Token* tokens() const {
4953
return tokenizer.tokens();
5054
}

0 commit comments

Comments
 (0)