Fixed #4465 (syntax error on valid C++ source file)
This commit is contained in:
parent
fe046a3350
commit
369e80b021
|
@ -68,21 +68,17 @@ const Token* TemplateSimplifier::hasComplicatedSyntaxErrorsInTemplates(Token *to
|
||||||
{
|
{
|
||||||
// check for more complicated syntax errors when using templates..
|
// check for more complicated syntax errors when using templates..
|
||||||
for (const Token *tok = tokens; tok; tok = tok->next()) {
|
for (const Token *tok = tokens; tok; tok = tok->next()) {
|
||||||
|
// skip executing scopes (ticket #3183)..
|
||||||
|
if (Token::simpleMatch(tok, "( {"))
|
||||||
|
tok = tok->link();
|
||||||
|
|
||||||
// skip executing scopes..
|
// skip executing scopes..
|
||||||
if (Token::simpleMatch(tok, ") {") || Token::Match(tok, ") %var% {") || Token::Match(tok, "[,=] {")) {
|
if (Token::simpleMatch(tok, ") {") || Token::Match(tok, ") %var% {") || Token::Match(tok, "[;,=] {")) {
|
||||||
while (tok->str() != "{")
|
while (tok->str() != "{")
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip executing scopes (ticket #1984)..
|
|
||||||
else if (Token::simpleMatch(tok, "; {"))
|
|
||||||
tok = tok->next()->link();
|
|
||||||
|
|
||||||
// skip executing scopes (ticket #3183)..
|
|
||||||
else if (Token::simpleMatch(tok, "( {"))
|
|
||||||
tok = tok->next()->link();
|
|
||||||
|
|
||||||
// skip executing scopes (ticket #1985)..
|
// skip executing scopes (ticket #1985)..
|
||||||
else if (Token::simpleMatch(tok, "try {")) {
|
else if (Token::simpleMatch(tok, "try {")) {
|
||||||
tok = tok->next()->link();
|
tok = tok->next()->link();
|
||||||
|
|
|
@ -5830,6 +5830,24 @@ private:
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
ASSERT_EQUALS("[test.cpp:2]: (error) syntax error\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:2]: (error) syntax error\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// code is ok, don't show syntax error
|
||||||
|
{
|
||||||
|
errout.str("");
|
||||||
|
std::istringstream istr("struct A {int a;int b};\n"
|
||||||
|
"class Fred {"
|
||||||
|
"public:\n"
|
||||||
|
" Fred() : a({1,2}) {\n"
|
||||||
|
" for (int i=0;i<6;i++);\n" // <- no syntax error
|
||||||
|
" }\n"
|
||||||
|
"private:\n"
|
||||||
|
" A a;\n"
|
||||||
|
"};\n");
|
||||||
|
Settings settings;
|
||||||
|
Tokenizer tokenizer(&settings, this);
|
||||||
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void syntax_error_templates_2() {
|
void syntax_error_templates_2() {
|
||||||
|
|
Loading…
Reference in New Issue