Fix issue 8732: Syntax error when using enable_if (#1453)
* Fix issue 8732: Syntax error when using enable_if * Fix FPs * Use simpleMatch
This commit is contained in:
parent
06ede9c239
commit
f5811c6818
|
@ -169,7 +169,9 @@ void TemplateSimplifier::checkComplicatedSyntaxErrorsInTemplates()
|
||||||
|
|
||||||
// parse this statement and see if the '<' and '>' are matching
|
// parse this statement and see if the '<' and '>' are matching
|
||||||
unsigned int level = 0;
|
unsigned int level = 0;
|
||||||
for (const Token *tok2 = tok; tok2 && !Token::Match(tok2, "[;{}]"); tok2 = tok2->next()) {
|
for (const Token *tok2 = tok; tok2 && !Token::simpleMatch(tok2, ";"); tok2 = tok2->next()) {
|
||||||
|
if(Token::simpleMatch(tok2, "{") && (!Token::Match(tok2->previous(), ">|%type%") || Token::simpleMatch(tok2->link(), "} ;")))
|
||||||
|
break;
|
||||||
if (tok2->str() == "(")
|
if (tok2->str() == "(")
|
||||||
tok2 = tok2->link();
|
tok2 = tok2->link();
|
||||||
else if (tok2->str() == "<") {
|
else if (tok2->str() == "<") {
|
||||||
|
|
|
@ -476,6 +476,7 @@ private:
|
||||||
// Make sure the Tokenizer::findGarbageCode() does not have false positives
|
// Make sure the Tokenizer::findGarbageCode() does not have false positives
|
||||||
// The TestGarbage ensures that there are true positives
|
// The TestGarbage ensures that there are true positives
|
||||||
TEST_CASE(findGarbageCode);
|
TEST_CASE(findGarbageCode);
|
||||||
|
TEST_CASE(checkEnableIf);
|
||||||
|
|
||||||
// --check-config
|
// --check-config
|
||||||
TEST_CASE(checkConfiguration);
|
TEST_CASE(checkConfiguration);
|
||||||
|
@ -8648,6 +8649,38 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void checkEnableIf() {
|
||||||
|
ASSERT_NO_THROW(tokenizeAndStringify(
|
||||||
|
"template<\n"
|
||||||
|
" typename U,\n"
|
||||||
|
" typename std::enable_if<\n"
|
||||||
|
" std::is_convertible<U, T>{}>::type* = nullptr>\n"
|
||||||
|
"void foo(U x);\n"))
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(tokenizeAndStringify(
|
||||||
|
"template<class t>\n"
|
||||||
|
"T f(const T a, const T b) {\n"
|
||||||
|
" return a < b ? b : a;\n"
|
||||||
|
"}\n"))
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(tokenizeAndStringify(
|
||||||
|
"template<class T>\n"
|
||||||
|
"struct A {\n"
|
||||||
|
" T f(const T a, const T b) {\n"
|
||||||
|
" return a < b ? b : a;\n"
|
||||||
|
" }\n"
|
||||||
|
"};\n"))
|
||||||
|
|
||||||
|
ASSERT_NO_THROW(tokenizeAndStringify(
|
||||||
|
"const int a = 1;\n"
|
||||||
|
"const int b = 2;\n"
|
||||||
|
"template<class T>\n"
|
||||||
|
"struct A {\n"
|
||||||
|
" int x = a < b ? b : a;"
|
||||||
|
"};\n"))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void checkConfig(const char code[]) {
|
void checkConfig(const char code[]) {
|
||||||
errout.str("");
|
errout.str("");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue