* Taking care of incorrect template syntax (missing close) Forward the incorrectness via throw, as there is no direct access to the syntaxError method, without converting the function to a member function
This commit is contained in:
parent
03b75b54ca
commit
705e5e3468
|
@ -2341,7 +2341,11 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map<std::stri
|
||||||
}
|
}
|
||||||
} else if (!c && ((TemplateSimplifier::templateParameters(tok2) > 0) ||
|
} else if (!c && ((TemplateSimplifier::templateParameters(tok2) > 0) ||
|
||||||
Token::simpleMatch(tok2, "< >") /* Ticket #4764 */)) {
|
Token::simpleMatch(tok2, "< >") /* Ticket #4764 */)) {
|
||||||
tok2 = tok2->findClosingBracket();
|
const Token * tok3 = tok2->findClosingBracket();
|
||||||
|
if (tok3 == nullptr) { /* Ticket #8151 */
|
||||||
|
throw tok2;
|
||||||
|
}
|
||||||
|
tok2 = tok3;
|
||||||
if (tok2->str() != ">")
|
if (tok2->str() != ">")
|
||||||
break;
|
break;
|
||||||
singleNameCount = 1;
|
singleNameCount = 1;
|
||||||
|
@ -2694,7 +2698,12 @@ void Tokenizer::setVarIdPass1()
|
||||||
if (!isC() && Token::simpleMatch(tok2, "const new"))
|
if (!isC() && Token::simpleMatch(tok2, "const new"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool decl = setVarIdParseDeclaration(&tok2, variableId, scopeStack.top().isExecutable, isCPP(), isC());
|
bool decl;
|
||||||
|
try { /* Ticket #8151 */
|
||||||
|
decl = setVarIdParseDeclaration(&tok2, variableId, scopeStack.top().isExecutable, isCPP(), isC());
|
||||||
|
} catch (const Token * errTok) {
|
||||||
|
syntaxError(errTok);
|
||||||
|
}
|
||||||
if (decl) {
|
if (decl) {
|
||||||
const Token* prev2 = tok2->previous();
|
const Token* prev2 = tok2->previous();
|
||||||
if (Token::Match(prev2, "%type% [;[=,)]") && tok2->previous()->str() != "const")
|
if (Token::Match(prev2, "%type% [;[=,)]") && tok2->previous()->str() != "const")
|
||||||
|
|
|
@ -216,6 +216,7 @@ private:
|
||||||
TEST_CASE(garbageCode183); // #7505
|
TEST_CASE(garbageCode183); // #7505
|
||||||
TEST_CASE(garbageCode184); // #7699
|
TEST_CASE(garbageCode184); // #7699
|
||||||
TEST_CASE(garbageCode185); // #6011
|
TEST_CASE(garbageCode185); // #6011
|
||||||
|
TEST_CASE(garbageCode186); // #8151
|
||||||
TEST_CASE(garbageValueFlow);
|
TEST_CASE(garbageValueFlow);
|
||||||
TEST_CASE(garbageSymbolDatabase);
|
TEST_CASE(garbageSymbolDatabase);
|
||||||
TEST_CASE(garbageAST);
|
TEST_CASE(garbageAST);
|
||||||
|
@ -1419,6 +1420,12 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #8151 - segfault due to incorrect template syntax
|
||||||
|
void garbageCode186() {
|
||||||
|
ASSERT_THROW(checkCode("A<B<><>C"), InternalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void syntaxErrorFirstToken() {
|
void syntaxErrorFirstToken() {
|
||||||
ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818
|
ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818
|
||||||
ASSERT_THROW(checkCode("*(*const<> (size_t); foo) { } *(*const (size_t)() ; foo) { }"), InternalError); // #6858
|
ASSERT_THROW(checkCode("*(*const<> (size_t); foo) { } *(*const (size_t)() ; foo) { }"), InternalError); // #6858
|
||||||
|
|
Loading…
Reference in New Issue