Fix 10808: cppcheckError AST cyclic dependency with decltype (#3850)
* Fix 10808: cppcheckError AST cyclic dependency with decltype * Format
This commit is contained in:
parent
b6876d22e6
commit
72d0f3e444
|
@ -497,7 +497,7 @@ struct AST_state {
|
||||||
explicit AST_state(bool cpp) : depth(0), inArrayAssignment(0), cpp(cpp), assign(0), inCase(false),stopAtColon(false), functionCallEndPar(nullptr) {}
|
explicit AST_state(bool cpp) : depth(0), inArrayAssignment(0), cpp(cpp), assign(0), inCase(false),stopAtColon(false), functionCallEndPar(nullptr) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
static Token * skipDecl(Token *tok)
|
static Token* skipDecl(Token* tok, std::vector<Token*>* inner = nullptr)
|
||||||
{
|
{
|
||||||
if (!Token::Match(tok->previous(), "( %name%"))
|
if (!Token::Match(tok->previous(), "( %name%"))
|
||||||
return tok;
|
return tok;
|
||||||
|
@ -510,7 +510,9 @@ static Token * skipDecl(Token *tok)
|
||||||
return tok;
|
return tok;
|
||||||
} else if (Token::Match(vartok, "%var% [:=(]")) {
|
} else if (Token::Match(vartok, "%var% [:=(]")) {
|
||||||
return vartok;
|
return vartok;
|
||||||
} else if (Token::simpleMatch(vartok, "decltype (") && !Token::Match(tok->linkAt(1), ") [,)]")) {
|
} else if (Token::Match(vartok, "decltype|typeof (") && !Token::Match(tok->linkAt(1), ") [,)]")) {
|
||||||
|
if (inner)
|
||||||
|
inner->push_back(vartok->tokAt(2));
|
||||||
return vartok->linkAt(1)->next();
|
return vartok->linkAt(1)->next();
|
||||||
}
|
}
|
||||||
vartok = vartok->next();
|
vartok = vartok->next();
|
||||||
|
@ -790,9 +792,9 @@ static void compileTerm(Token *&tok, AST_state& state)
|
||||||
}
|
}
|
||||||
} else if (!state.cpp || !Token::Match(tok, "new|delete %name%|*|&|::|(|[")) {
|
} else if (!state.cpp || !Token::Match(tok, "new|delete %name%|*|&|::|(|[")) {
|
||||||
Token* tok2 = tok;
|
Token* tok2 = tok;
|
||||||
tok = skipDecl(tok);
|
std::vector<Token*> inner;
|
||||||
if (Token::simpleMatch(tok2, "decltype (")) {
|
tok = skipDecl(tok, &inner);
|
||||||
Token* tok3 = tok2->next();
|
for (Token* tok3 : inner) {
|
||||||
AST_state state1(state.cpp);
|
AST_state state1(state.cpp);
|
||||||
compileExpression(tok3, state1);
|
compileExpression(tok3, state1);
|
||||||
}
|
}
|
||||||
|
@ -1434,9 +1436,9 @@ static Token * createAstAtToken(Token *tok, bool cpp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Token *tok2 = skipDecl(tok->tokAt(2));
|
std::vector<Token*> inner;
|
||||||
if (Token::simpleMatch(tok->tokAt(2), "decltype (")) {
|
Token* tok2 = skipDecl(tok->tokAt(2), &inner);
|
||||||
Token* tok3 = tok->tokAt(4);
|
for (Token* tok3 : inner) {
|
||||||
AST_state state1(cpp);
|
AST_state state1(cpp);
|
||||||
compileExpression(tok3, state1);
|
compileExpression(tok3, state1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6175,6 +6175,8 @@ private:
|
||||||
ASSERT_EQUALS("decltypex({", testAst("decltype(x){};"));
|
ASSERT_EQUALS("decltypex({", testAst("decltype(x){};"));
|
||||||
ASSERT_EQUALS("decltypexy+(yx+(", testAst("decltype(x+y)(y+x);"));
|
ASSERT_EQUALS("decltypexy+(yx+(", testAst("decltype(x+y)(y+x);"));
|
||||||
ASSERT_EQUALS("decltypexy+(yx+{", testAst("decltype(x+y){y+x};"));
|
ASSERT_EQUALS("decltypexy+(yx+{", testAst("decltype(x+y){y+x};"));
|
||||||
|
ASSERT_EQUALS("adecltypeac::(,decltypead::(,",
|
||||||
|
testAst("template <typename a> void b(a &, decltype(a::c), decltype(a::d));"));
|
||||||
|
|
||||||
// #10334: Do not hang!
|
// #10334: Do not hang!
|
||||||
tokenizeAndStringify("void foo(const std::vector<std::string>& locations = {\"\"}) {\n"
|
tokenizeAndStringify("void foo(const std::vector<std::string>& locations = {\"\"}) {\n"
|
||||||
|
|
Loading…
Reference in New Issue