Simplified several Token::Match/simpleMatch calls when match string consists of a single pattern
Fixed two CheckInternal error messages
This commit is contained in:
parent
2ad38c8701
commit
0105f8223c
|
@ -610,7 +610,7 @@ void CheckClass::initializeVarList(const Function &func, std::list<const Functio
|
||||||
else if (Token::Match(ftok, "%var% [|.")) {
|
else if (Token::Match(ftok, "%var% [|.")) {
|
||||||
const Token *tok2 = ftok;
|
const Token *tok2 = ftok;
|
||||||
while (tok2) {
|
while (tok2) {
|
||||||
if (Token::simpleMatch(tok2->next(), "["))
|
if (tok2->strAt(1) == "[")
|
||||||
tok2 = tok2->next()->link();
|
tok2 = tok2->next()->link();
|
||||||
else if (Token::Match(tok2->next(), ". %var%"))
|
else if (Token::Match(tok2->next(), ". %var%"))
|
||||||
tok2 = tok2->tokAt(2);
|
tok2 = tok2->tokAt(2);
|
||||||
|
|
|
@ -247,7 +247,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
||||||
deallocUseError(tok, tok->str());
|
deallocUseError(tok, tok->str());
|
||||||
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
|
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
|
||||||
varInfo->erase(tok->varId());
|
varInfo->erase(tok->varId());
|
||||||
} else if (Token::simpleMatch(tok->previous(), "=")) {
|
} else if (tok->strAt(-1) == "=") {
|
||||||
varInfo->erase(tok->varId());
|
varInfo->erase(tok->varId());
|
||||||
}
|
}
|
||||||
} else if (Token::Match(tok->previous(), "& %var% = %var% ;")) {
|
} else if (Token::Match(tok->previous(), "& %var% = %var% ;")) {
|
||||||
|
|
|
@ -1232,7 +1232,7 @@ Token *CheckMemoryLeakInFunction::getcode(const Token *tok, std::list<const Toke
|
||||||
if (tok2->varId() == varid) {
|
if (tok2->varId() == varid) {
|
||||||
// Read data..
|
// Read data..
|
||||||
if (!Token::Match(tok2->previous(), "&|(") &&
|
if (!Token::Match(tok2->previous(), "&|(") &&
|
||||||
Token::simpleMatch(tok2->next(), "[")) {
|
tok2->strAt(1) == "[") {
|
||||||
} else if (f.empty() ||
|
} else if (f.empty() ||
|
||||||
!test_white_list(f.top()->str()) ||
|
!test_white_list(f.top()->str()) ||
|
||||||
getDeallocationType(f.top(),varid)) {
|
getDeallocationType(f.top(),varid)) {
|
||||||
|
|
|
@ -239,7 +239,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2nd parameter..
|
// 2nd parameter..
|
||||||
if (secondParam && ((value == 0 && secondParam->str() == "0") || (Token::Match(secondParam, "%var%") && secondParam->varId() > 0))) {
|
if (secondParam && ((value == 0 && secondParam->str() == "0") || (secondParam->varId() > 0))) {
|
||||||
if (functionNames2_all.find(tok.str()) != functionNames2_all.end())
|
if (functionNames2_all.find(tok.str()) != functionNames2_all.end())
|
||||||
var.push_back(secondParam);
|
var.push_back(secondParam);
|
||||||
else if (value == 0 && functionNames2_nullptr.find(tok.str()) != functionNames2_nullptr.end())
|
else if (value == 0 && functionNames2_nullptr.find(tok.str()) != functionNames2_nullptr.end())
|
||||||
|
|
|
@ -61,7 +61,7 @@ void CheckOther::checkCastIntToCharAndBack()
|
||||||
const Variable *var = tok->variable();
|
const Variable *var = tok->variable();
|
||||||
if (var && var->typeEndToken()->str() == "char" && !var->typeEndToken()->isSigned()) {
|
if (var && var->typeEndToken()->str() == "char" && !var->typeEndToken()->isSigned()) {
|
||||||
uiVarId = tok->varId();
|
uiVarId = tok->varId();
|
||||||
strFunctionName = tok->tokAt(2)->str();
|
strFunctionName = tok->strAt(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (Token::Match(tok, "EOF %comp% ( %var% = fclose|fflush|fputc|fputs|fscanf|getchar|getc|fgetc|putchar|putc|puts|scanf|sscanf|ungetc (")) {
|
} else if (Token::Match(tok, "EOF %comp% ( %var% = fclose|fflush|fputc|fputs|fscanf|getchar|getc|fgetc|putchar|putc|puts|scanf|sscanf|ungetc (")) {
|
||||||
|
@ -69,7 +69,7 @@ void CheckOther::checkCastIntToCharAndBack()
|
||||||
if (tok && tok->varId()) {
|
if (tok && tok->varId()) {
|
||||||
const Variable *var = tok->variable();
|
const Variable *var = tok->variable();
|
||||||
if (var && var->typeEndToken()->str() == "char" && !var->typeEndToken()->isSigned()) {
|
if (var && var->typeEndToken()->str() == "char" && !var->typeEndToken()->isSigned()) {
|
||||||
checkCastIntToCharAndBackError(tok, tok->tokAt(2)->str());
|
checkCastIntToCharAndBackError(tok, tok->strAt(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2548,7 +2548,7 @@ void CheckOther::checkComparisonOfFuncReturningBool()
|
||||||
continue;
|
continue;
|
||||||
const Token *first_token;
|
const Token *first_token;
|
||||||
bool first_token_func_of_type_bool = false;
|
bool first_token_func_of_type_bool = false;
|
||||||
if (Token::simpleMatch(tok->previous(), ")")) {
|
if (tok->strAt(-1) == ")") {
|
||||||
first_token = tok->previous()->link()->previous();
|
first_token = tok->previous()->link()->previous();
|
||||||
} else {
|
} else {
|
||||||
first_token = tok->previous();
|
first_token = tok->previous();
|
||||||
|
@ -2996,16 +2996,14 @@ void CheckOther::checkDoubleFree()
|
||||||
// If it is a function call, then clear those variables in its argument list
|
// If it is a function call, then clear those variables in its argument list
|
||||||
else if (Token::simpleMatch(tok->next()->link(), ") ;")) {
|
else if (Token::simpleMatch(tok->next()->link(), ") ;")) {
|
||||||
for (const Token* tok2 = tok->tokAt(2); tok2 != tok->linkAt(1); tok2 = tok2->next()) {
|
for (const Token* tok2 = tok->tokAt(2); tok2 != tok->linkAt(1); tok2 = tok2->next()) {
|
||||||
if (Token::Match(tok2, "%var%")) {
|
if (tok2->varId()) {
|
||||||
unsigned int var = tok2->varId();
|
unsigned int var = tok2->varId();
|
||||||
if (var) {
|
|
||||||
freedVariables.erase(var);
|
freedVariables.erase(var);
|
||||||
closeDirVariables.erase(var);
|
closeDirVariables.erase(var);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// If a pointer is assigned a new value, remove it from the set of previously freed variables
|
// If a pointer is assigned a new value, remove it from the set of previously freed variables
|
||||||
else if (Token::Match(tok, "%var% =")) {
|
else if (Token::Match(tok, "%var% =")) {
|
||||||
|
|
|
@ -370,7 +370,7 @@ private:
|
||||||
if (tok2->varId() &&
|
if (tok2->varId() &&
|
||||||
!Token::Match(tok2->previous(), "&|::") &&
|
!Token::Match(tok2->previous(), "&|::") &&
|
||||||
!Token::simpleMatch(tok2->tokAt(-2), "& (") &&
|
!Token::simpleMatch(tok2->tokAt(-2), "& (") &&
|
||||||
!Token::simpleMatch(tok2->next(), "=")) {
|
tok2->strAt(1) != "=") {
|
||||||
// Multiple assignments..
|
// Multiple assignments..
|
||||||
if (Token::Match(tok2->next(), ".|[")) {
|
if (Token::Match(tok2->next(), ".|[")) {
|
||||||
const Token * tok3 = tok2;
|
const Token * tok3 = tok2;
|
||||||
|
@ -547,12 +547,12 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.next(), "(")) {
|
if (tok.strAt(1) == "(") {
|
||||||
use_pointer(checks, &tok);
|
use_pointer(checks, &tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::Match(tok.tokAt(-2), "[;{}] *")) {
|
if (Token::Match(tok.tokAt(-2), "[;{}] *")) {
|
||||||
if (Token::simpleMatch(tok.next(), "=")) {
|
if (tok.strAt(1) == "=") {
|
||||||
// is the pointer used in the rhs?
|
// is the pointer used in the rhs?
|
||||||
bool used = false;
|
bool used = false;
|
||||||
for (const Token *tok2 = tok.tokAt(2); tok2; tok2 = tok2->next()) {
|
for (const Token *tok2 = tok.tokAt(2); tok2; tok2 = tok2->next()) {
|
||||||
|
@ -580,22 +580,22 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
else if ((!isC && (Token::Match(tok.previous(), "<<|>>") || Token::Match(tok.previous(), "[;{}] %var% <<"))) ||
|
else if ((!isC && (Token::Match(tok.previous(), "<<|>>") || Token::Match(tok.previous(), "[;{}] %var% <<"))) ||
|
||||||
Token::simpleMatch(tok.next(), "=")) {
|
tok.strAt(1) == "=") {
|
||||||
// TODO: Don't bail out for "<<" and ">>" if these are
|
// TODO: Don't bail out for "<<" and ">>" if these are
|
||||||
// just computations
|
// just computations
|
||||||
ExecutionPath::bailOutVar(checks, tok.varId());
|
ExecutionPath::bailOutVar(checks, tok.varId());
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.next(), "[")) {
|
if (tok.strAt(1) == "[" && tok.next()->link()) {
|
||||||
const Token *tok2 = tok.next()->link();
|
const Token *tok2 = tok.next()->link();
|
||||||
if (Token::simpleMatch(tok2 ? tok2->next() : 0, "=")) {
|
if (tok2->strAt(1) == "=") {
|
||||||
ExecutionPath::bailOutVar(checks, tok.varId());
|
ExecutionPath::bailOutVar(checks, tok.varId());
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.previous(), "delete") ||
|
if (tok.strAt(-1) == "delete" ||
|
||||||
Token::simpleMatch(tok.tokAt(-3), "delete [ ]")) {
|
Token::simpleMatch(tok.tokAt(-3), "delete [ ]")) {
|
||||||
dealloc_pointer(checks, &tok);
|
dealloc_pointer(checks, &tok);
|
||||||
return &tok;
|
return &tok;
|
||||||
|
@ -764,7 +764,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tok.varId()) {
|
if (tok.varId()) {
|
||||||
if (Token::simpleMatch(tok.previous(), "=")) {
|
if (tok.strAt(-1) == "=") {
|
||||||
if (Token::Match(tok.tokAt(-3), "& %var% =")) {
|
if (Token::Match(tok.tokAt(-3), "& %var% =")) {
|
||||||
bailOutVar(checks, tok.varId());
|
bailOutVar(checks, tok.varId());
|
||||||
return &tok;
|
return &tok;
|
||||||
|
@ -786,12 +786,12 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.next(), ".")) {
|
if (tok.strAt(1) == ".") {
|
||||||
bailOutVar(checks, tok.varId());
|
bailOutVar(checks, tok.varId());
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.next(), "[")) {
|
if (tok.strAt(1) == "[") {
|
||||||
ExecutionPath::bailOutVar(checks, tok.varId());
|
ExecutionPath::bailOutVar(checks, tok.varId());
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
@ -801,7 +801,7 @@ private:
|
||||||
return &tok;
|
return &tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::simpleMatch(tok.previous(), "&")) {
|
if (tok.strAt(-1) == "&") {
|
||||||
ExecutionPath::bailOutVar(checks, tok.varId());
|
ExecutionPath::bailOutVar(checks, tok.varId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1532,7 +1532,7 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, bool cpp
|
||||||
const Token *tok2 = vartok->tokAt(-2);
|
const Token *tok2 = vartok->tokAt(-2);
|
||||||
if (tok2 && (tok2->isConstOp() || tok2->str() == "("))
|
if (tok2 && (tok2->isConstOp() || tok2->str() == "("))
|
||||||
return false; // address of
|
return false; // address of
|
||||||
if (Token::simpleMatch(tok2,")"))
|
if (tok2 && tok2->str() == ")")
|
||||||
tok2 = tok2->link()->previous();
|
tok2 = tok2->link()->previous();
|
||||||
while (tok2 && tok2->str() == "(")
|
while (tok2 && tok2->str() == "(")
|
||||||
tok2 = tok2->previous();
|
tok2 = tok2->previous();
|
||||||
|
|
|
@ -593,7 +593,7 @@ static const Token* doAssignment(Variables &variables, const Token *tok, bool de
|
||||||
// check for alias to struct member
|
// check for alias to struct member
|
||||||
// char c[10]; a.b = c;
|
// char c[10]; a.b = c;
|
||||||
else if (Token::Match(tok->tokAt(-2), "%var% .")) {
|
else if (Token::Match(tok->tokAt(-2), "%var% .")) {
|
||||||
if (Token::Match(tok->tokAt(2), "%var%")) {
|
if (tok->tokAt(2)->varId()) {
|
||||||
unsigned int varid2 = tok->tokAt(2)->varId();
|
unsigned int varid2 = tok->tokAt(2)->varId();
|
||||||
Variables::VariableUsage *var2 = variables.find(varid2);
|
Variables::VariableUsage *var2 = variables.find(varid2);
|
||||||
|
|
||||||
|
@ -717,7 +717,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
if (defValTok && defValTok->str() == "=") {
|
if (defValTok && defValTok->str() == "=") {
|
||||||
if (defValTok->next() && defValTok->next()->str() == "{") {
|
if (defValTok->next() && defValTok->next()->str() == "{") {
|
||||||
for (const Token* tok = defValTok; tok && tok != defValTok->linkAt(1); tok = tok->next())
|
for (const Token* tok = defValTok; tok && tok != defValTok->linkAt(1); tok = tok->next())
|
||||||
if (Token::Match(tok, "%var%")) // Variables used to initialize the array read.
|
if (tok->varId()) // Variables used to initialize the array read.
|
||||||
variables.read(tok->varId(), i->nameToken());
|
variables.read(tok->varId(), i->nameToken());
|
||||||
} else
|
} else
|
||||||
doAssignment(variables, i->nameToken(), false, scope);
|
doAssignment(variables, i->nameToken(), false, scope);
|
||||||
|
@ -873,7 +873,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
variables.read(varid1, tok);
|
variables.read(varid1, tok);
|
||||||
} else {
|
} else {
|
||||||
Variables::VariableUsage *var = variables.find(varid1);
|
Variables::VariableUsage *var = variables.find(varid1);
|
||||||
if (var && Token::simpleMatch(start->previous(), ",")) {
|
if (var && start->strAt(-1) == ",") {
|
||||||
variables.use(varid1, tok);
|
variables.use(varid1, tok);
|
||||||
} else if (var && var->_type == Variables::reference) {
|
} else if (var && var->_type == Variables::reference) {
|
||||||
variables.writeAliases(varid1, tok);
|
variables.writeAliases(varid1, tok);
|
||||||
|
@ -1007,12 +1007,12 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
variables.use(tok->varId(), tok); // use = read + write
|
variables.use(tok->varId(), tok); // use = read + write
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (tok->isExtendedOp() &&
|
else if (tok->isExtendedOp() && tok->next() &&
|
||||||
Token::Match(tok->next(), "%var%") && !Token::Match(tok->next(), "true|false|new") && tok->strAt(2) != "=") {
|
tok->next()->varId() && !Token::Match(tok->next(), "true|false|new") && tok->strAt(2) != "=") {
|
||||||
variables.readAll(tok->next()->varId(), tok);
|
variables.readAll(tok->next()->varId(), tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (Token::Match(tok, "%var%") && tok->next() && (tok->next()->str() == ")" || tok->next()->isExtendedOp())) {
|
else if (tok->varId() && tok->next() && (tok->next()->str() == ")" || tok->next()->isExtendedOp())) {
|
||||||
variables.readAll(tok->varId(), tok);
|
variables.readAll(tok->varId(), tok);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2269,7 +2269,7 @@ const Variable *Scope::getVariable(const std::string &varname) const
|
||||||
|
|
||||||
static const Token* skipScopeIdentifiers(const Token* tok)
|
static const Token* skipScopeIdentifiers(const Token* tok)
|
||||||
{
|
{
|
||||||
if (Token::simpleMatch(tok, "::")) {
|
if (tok && tok->str() == "::") {
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
}
|
}
|
||||||
while (Token::Match(tok, "%type% ::")) {
|
while (Token::Match(tok, "%type% ::")) {
|
||||||
|
|
|
@ -798,7 +798,7 @@ bool TemplateSimplifier::simplifyCalculations(Token *_tokens)
|
||||||
!tok->isName() &&
|
!tok->isName() &&
|
||||||
tok->str() != ">" &&
|
tok->str() != ">" &&
|
||||||
tok->str() != "]" &&
|
tok->str() != "]" &&
|
||||||
!Token::simpleMatch(tok->previous(), "operator") &&
|
tok->strAt(-1) != "operator" &&
|
||||||
!Token::simpleMatch(tok->previous(), "* )") &&
|
!Token::simpleMatch(tok->previous(), "* )") &&
|
||||||
!Token::simpleMatch(tok->previous(), ") )") &&
|
!Token::simpleMatch(tok->previous(), ") )") &&
|
||||||
!Token::Match(tok->tokAt(-2), "* %var% )") &&
|
!Token::Match(tok->tokAt(-2), "* %var% )") &&
|
||||||
|
|
|
@ -2616,7 +2616,7 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map<std::stri
|
||||||
if (executableScope && ref) {
|
if (executableScope && ref) {
|
||||||
if (tok2->str() == "(" || tok2->str() == "=")
|
if (tok2->str() == "(" || tok2->str() == "=")
|
||||||
; // reference is assigned => ok
|
; // reference is assigned => ok
|
||||||
else if (tok2->str() != ")" || !Token::simpleMatch(tok2->link()->previous(), "catch"))
|
else if (tok2->str() != ")" || tok2->link()->strAt(-1) != "catch")
|
||||||
return false; // not catching by reference => not declaration
|
return false; // not catching by reference => not declaration
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2790,9 +2790,9 @@ void Tokenizer::setVarId()
|
||||||
} else if (tok->str() == "{") {
|
} else if (tok->str() == "{") {
|
||||||
initlist = false;
|
initlist = false;
|
||||||
// parse anonymous unions as part of the current scope
|
// parse anonymous unions as part of the current scope
|
||||||
if (!(Token::simpleMatch(tok->previous(), "union") && Token::simpleMatch(tok->link(), "} ;"))) {
|
if (!(tok->strAt(-1) == "union" && Token::simpleMatch(tok->link(), "} ;"))) {
|
||||||
scopestartvarid.push(_varId);
|
scopestartvarid.push(_varId);
|
||||||
if (Token::simpleMatch(tok->previous(), ")") || Token::Match(tok->tokAt(-2), ") %type%")) {
|
if (tok->strAt(-1) == ")" || Token::Match(tok->tokAt(-2), ") %type%")) {
|
||||||
executableScope.push(true);
|
executableScope.push(true);
|
||||||
} else {
|
} else {
|
||||||
executableScope.push(executableScope.top());
|
executableScope.push(executableScope.top());
|
||||||
|
@ -5055,7 +5055,7 @@ void Tokenizer::simplifyVarDecl(bool only_k_r_fpar)
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (Token::simpleMatch(tok2->next(), "*"))
|
if (tok2->strAt(1) == "*")
|
||||||
break;
|
break;
|
||||||
|
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
|
@ -6139,7 +6139,7 @@ bool Tokenizer::simplifyKnownVariablesGetData(unsigned int varid, Token **_tok2,
|
||||||
} else {
|
} else {
|
||||||
value = tok2->strAt(2);
|
value = tok2->strAt(2);
|
||||||
valueVarId = tok2->tokAt(2)->varId();
|
valueVarId = tok2->tokAt(2)->varId();
|
||||||
if (Token::simpleMatch(tok2->next(), "[")) {
|
if (tok2->strAt(1) == "[") {
|
||||||
value = tok2->next()->link()->strAt(2);
|
value = tok2->next()->link()->strAt(2);
|
||||||
valueVarId = 0;
|
valueVarId = 0;
|
||||||
} else if (value == "&") {
|
} else if (value == "&") {
|
||||||
|
@ -6717,7 +6717,7 @@ bool Tokenizer::simplifyRedundantParentheses()
|
||||||
|
|
||||||
// Simplify "!!operator !!(%var%|)) ( %num%|%bool% ) %op%|;|,|)"
|
// Simplify "!!operator !!(%var%|)) ( %num%|%bool% ) %op%|;|,|)"
|
||||||
if (Token::Match(tok, "( %bool%|%num% ) %cop%|;|,|)") &&
|
if (Token::Match(tok, "( %bool%|%num% ) %cop%|;|,|)") &&
|
||||||
!Token::simpleMatch(tok->tokAt(-2), "operator") &&
|
tok->strAt(-2) != "operator" &&
|
||||||
tok->previous() &&
|
tok->previous() &&
|
||||||
!tok->previous()->isName() &&
|
!tok->previous()->isName() &&
|
||||||
tok->previous()->str() != ")" &&
|
tok->previous()->str() != ")" &&
|
||||||
|
@ -8587,7 +8587,7 @@ void Tokenizer::simplifyKeyword()
|
||||||
|
|
||||||
if (_settings->standards.c >= Standards::C99) {
|
if (_settings->standards.c >= Standards::C99) {
|
||||||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
||||||
while (Token::simpleMatch(tok, "restrict")) {
|
while (tok && tok->str() == "restrict") {
|
||||||
tok->deleteThis();
|
tok->deleteThis();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue