Fix synax error in issue 9057 and 9138 (#1843)

This commit is contained in:
Paul Fultz II 2019-05-21 01:47:10 -05:00 committed by Daniel Marjamäki
parent 29e5992e51
commit 9055682fdc
2 changed files with 55 additions and 1 deletions

View File

@ -3845,8 +3845,15 @@ void Tokenizer::createLinks2()
continue; continue;
} }
while (!type.empty() && type.top()->str() == "<") while (!type.empty() && type.top()->str() == "<") {
const Token* end = type.top()->findClosingBracket();
if (Token::Match(end, "> ;|>"))
break;
// Variable declaration
if (Token::Match(end, "> %var% ;") && (type.top()->tokAt(-2) == nullptr || Token::Match(type.top()->tokAt(-2), ";|}|{")))
break;
type.pop(); type.pop();
}
} else if (token->str() == "<" && } else if (token->str() == "<" &&
((token->previous() && token->previous()->isName() && !token->previous()->varId()) || ((token->previous() && token->previous()->isName() && !token->previous()->varId()) ||
Token::Match(token->next(), ">|>>"))) { Token::Match(token->next(), ">|>>"))) {

View File

@ -4593,6 +4593,30 @@ private:
ASSERT_EQUALS(true, tok->linkAt(3) == nullptr); ASSERT_EQUALS(true, tok->linkAt(3) == nullptr);
} }
{
// bool f = a < b || c > d
const char code[] = "bool f = a < b || c > d;";
errout.str("");
Tokenizer tokenizer(&settings0, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
const Token *tok = tokenizer.tokens();
ASSERT_EQUALS(true, tok->linkAt(4) == nullptr);
}
{
// template
const char code[] = "a < b || c > d;";
errout.str("");
Tokenizer tokenizer(&settings0, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
const Token *tok = tokenizer.tokens();
ASSERT_EQUALS(true, tok->linkAt(1) == tok->tokAt(5));
}
{ {
// if (a < ... > d) { } // if (a < ... > d) { }
const char code[] = "if (a < b || c == 3 || d > e);"; const char code[] = "if (a < b || c == 3 || d > e);";
@ -4820,6 +4844,20 @@ private:
tokenizer.tokenize(istr, "test.cpp"); tokenizer.tokenize(istr, "test.cpp");
ASSERT(nullptr != Token::findsimplematch(tokenizer.tokens(), "> [")->link()); ASSERT(nullptr != Token::findsimplematch(tokenizer.tokens(), "> [")->link());
} }
{
// #9057
const char code[] = "template <bool> struct a;\n"
"template <bool b, typename> using c = typename a<b>::d;\n"
"template <typename e> using f = c<e() && sizeof(int), int>;\n"
"template <typename e, typename = f<e>> struct g {};\n"
"template <typename e> using baz = g<e>;\n";
Tokenizer tokenizer(&settings0, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.cpp");
ASSERT(nullptr != Token::findsimplematch(tokenizer.tokens(), "> > ;")->link());
ASSERT(nullptr != Token::findsimplematch(tokenizer.tokens(), "> ;")->link());
}
} }
void simplifyString() { void simplifyString() {
@ -7617,6 +7655,15 @@ private:
" a<> b;\n" " a<> b;\n"
" b.a<>::c();\n" " b.a<>::c();\n"
"}\n")) "}\n"))
// #9138
ASSERT_NO_THROW(tokenizeAndStringify(
"template <typename> struct a;\n"
"template <bool> using c = int;\n"
"template <bool b> c<b> d;\n"
"template <> struct a<int> {\n"
"template <typename e> constexpr auto g() { d<0 || e::f>; return 0; }\n"
"};\n"))
} }