Fixed #8390 (Syntax error from an MSVC internal header)
This commit is contained in:
parent
e38ec41ded
commit
3d4b773fd1
|
@ -3272,13 +3272,14 @@ void Tokenizer::createLinks2()
|
||||||
type.pop();
|
type.pop();
|
||||||
Token * const top2 = type.empty() ? nullptr : type.top();
|
Token * const top2 = type.empty() ? nullptr : type.top();
|
||||||
type.push(top1);
|
type.push(top1);
|
||||||
if (token->str() == ">>" && (!top2 || top2->str() != "<"))
|
if (!top2 || top2->str() != "<") {
|
||||||
|
if (token->str() == ">>")
|
||||||
continue;
|
continue;
|
||||||
if (token->next() &&
|
if (token->next() &&
|
||||||
!Token::Match(token->next(), "%name%|>|&|&&|*|::|,|(|)|{|}|;|[|:") &&
|
!Token::Match(token->next(), "%name%|>|&|&&|*|::|,|(|)|{|}|;|[|:") &&
|
||||||
!Token::Match(token->next(), "&& %name% ="))
|
!Token::Match(token->next(), "&& %name% ="))
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
// if > is followed by [ .. "new a<b>[" is expected
|
// if > is followed by [ .. "new a<b>[" is expected
|
||||||
if (token->strAt(1) == "[") {
|
if (token->strAt(1) == "[") {
|
||||||
Token *prev = type.top()->previous();
|
Token *prev = type.top()->previous();
|
||||||
|
@ -8392,7 +8393,16 @@ void Tokenizer::findGarbageCode() const
|
||||||
}
|
}
|
||||||
|
|
||||||
// Operators without operands..
|
// Operators without operands..
|
||||||
|
const Token *templateEndToken = nullptr;
|
||||||
for (const Token *tok = tokens(); tok; tok = tok->next()) {
|
for (const Token *tok = tokens(); tok; tok = tok->next()) {
|
||||||
|
if (!templateEndToken) {
|
||||||
|
if (tok->str() == "<" && isCPP())
|
||||||
|
templateEndToken = tok->findClosingBracket();
|
||||||
|
} else if (templateEndToken == tok) {
|
||||||
|
templateEndToken = nullptr;
|
||||||
|
} else if (Token::Match(tok, "> %cop%")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (Token::Match(tok, "%cop%|=|,|[ %or%|%oror%|/|%"))
|
if (Token::Match(tok, "%cop%|=|,|[ %or%|%oror%|/|%"))
|
||||||
syntaxError(tok);
|
syntaxError(tok);
|
||||||
if (Token::Match(tok, ";|(|[ %comp%"))
|
if (Token::Match(tok, ";|(|[ %comp%"))
|
||||||
|
|
|
@ -1455,6 +1455,8 @@ private:
|
||||||
void garbageCode187() { // # 8152 - segfault in handling
|
void garbageCode187() { // # 8152 - segfault in handling
|
||||||
const std::string inp("0|\0|0>;\n", 8);
|
const std::string inp("0|\0|0>;\n", 8);
|
||||||
ASSERT_THROW(checkCode(inp), InternalError);
|
ASSERT_THROW(checkCode(inp), InternalError);
|
||||||
|
|
||||||
|
checkCode("template<class T> struct S : A< B<T> || C<T> > {};"); // No syntax error: #8390
|
||||||
}
|
}
|
||||||
|
|
||||||
void garbageCode188() { // #8255
|
void garbageCode188() { // #8255
|
||||||
|
|
Loading…
Reference in New Issue