Parser; Set varid for structured binding variables
This commit is contained in:
parent
3a7979171c
commit
8aa9e448f5
|
@ -3857,15 +3857,20 @@ void Tokenizer::setVarIdPass1()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool decl;
|
bool decl;
|
||||||
if (isCPP() && Token::Match(tok->previous(), "for ( const| auto &|&&| [")) {
|
if (isCPP() && mSettings->standards.cpp >= Standards::CPP17 && Token::Match(tok, "[(;{}] const| auto &|&&| [")) {
|
||||||
|
// Structured bindings
|
||||||
tok2 = Token::findsimplematch(tok, "[");
|
tok2 = Token::findsimplematch(tok, "[");
|
||||||
while (tok2 && tok2->str() != "]") {
|
if ((Token::simpleMatch(tok->previous(), "for (") && Token::simpleMatch(tok2->link(), "] :")) ||
|
||||||
if (Token::Match(tok2, "%name% [,]]"))
|
Token::simpleMatch(tok2->link(), "] =")) {
|
||||||
variableMap.addVariable(tok2->str());
|
while (tok2 && tok2->str() != "]") {
|
||||||
tok2 = tok2->next();
|
if (Token::Match(tok2, "%name% [,]]"))
|
||||||
|
variableMap.addVariable(tok2->str());
|
||||||
|
tok2 = tok2->next();
|
||||||
|
}
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try { /* Ticket #8151 */
|
try { /* Ticket #8151 */
|
||||||
decl = setVarIdParseDeclaration(&tok2, variableMap.map(), scopeStack.top().isExecutable, isCPP(), isC());
|
decl = setVarIdParseDeclaration(&tok2, variableMap.map(), scopeStack.top().isExecutable, isCPP(), isC());
|
||||||
} catch (const Token * errTok) {
|
} catch (const Token * errTok) {
|
||||||
|
|
|
@ -216,6 +216,8 @@ private:
|
||||||
TEST_CASE(decltype2);
|
TEST_CASE(decltype2);
|
||||||
|
|
||||||
TEST_CASE(exprid1);
|
TEST_CASE(exprid1);
|
||||||
|
|
||||||
|
TEST_CASE(structuredBindings);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tokenize(const char code[], const char filename[] = "test.cpp") {
|
std::string tokenize(const char code[], const char filename[] = "test.cpp") {
|
||||||
|
@ -224,7 +226,7 @@ private:
|
||||||
Settings settings;
|
Settings settings;
|
||||||
settings.platform(Settings::Unix64);
|
settings.platform(Settings::Unix64);
|
||||||
settings.standards.c = Standards::C89;
|
settings.standards.c = Standards::C89;
|
||||||
settings.standards.cpp = Standards::CPP11;
|
settings.standards.cpp = Standards::CPPLatest;
|
||||||
settings.checkUnusedTemplates = true;
|
settings.checkUnusedTemplates = true;
|
||||||
|
|
||||||
Tokenizer tokenizer(&settings, this);
|
Tokenizer tokenizer(&settings, this);
|
||||||
|
@ -243,7 +245,7 @@ private:
|
||||||
Settings settings;
|
Settings settings;
|
||||||
settings.platform(Settings::Unix64);
|
settings.platform(Settings::Unix64);
|
||||||
settings.standards.c = Standards::C89;
|
settings.standards.c = Standards::C89;
|
||||||
settings.standards.cpp = Standards::CPP11;
|
settings.standards.cpp = Standards::CPPLatest;
|
||||||
settings.checkUnusedTemplates = true;
|
settings.checkUnusedTemplates = true;
|
||||||
|
|
||||||
Tokenizer tokenizer(&settings, this);
|
Tokenizer tokenizer(&settings, this);
|
||||||
|
@ -1285,7 +1287,7 @@ private:
|
||||||
"2: list < int > :: iterator it@2 ;\n"
|
"2: list < int > :: iterator it@2 ;\n"
|
||||||
"3: std :: vector < std :: string > dirs@3 ;\n"
|
"3: std :: vector < std :: string > dirs@3 ;\n"
|
||||||
"4: std :: map < int , int > coords@4 ;\n"
|
"4: std :: map < int , int > coords@4 ;\n"
|
||||||
"5: std :: unordered_map < int , int > xy@5 ;\n"
|
"5: std :: tr1 :: unordered_map < int , int > xy@5 ;\n"
|
||||||
"6: std :: list < boost :: wave :: token_id > tokens@6 ;\n"
|
"6: std :: list < boost :: wave :: token_id > tokens@6 ;\n"
|
||||||
"7: static std :: vector < CvsProcess * > ex1@7 ;\n"
|
"7: static std :: vector < CvsProcess * > ex1@7 ;\n"
|
||||||
"8: extern std :: vector < CvsProcess * > ex2@8 ;\n"
|
"8: extern std :: vector < CvsProcess * > ex2@8 ;\n"
|
||||||
|
@ -3429,6 +3431,12 @@ private:
|
||||||
|
|
||||||
ASSERT_EQUALS(expected, actual);
|
ASSERT_EQUALS(expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void structuredBindings() {
|
||||||
|
const char code[] = "int foo() { auto [x,y] = xy(); return x+y; }";
|
||||||
|
ASSERT_EQUALS("1: int foo ( ) { auto [ x@1 , y@2 ] = xy ( ) ; return x@1 + y@2 ; }\n",
|
||||||
|
tokenize(code));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestVarID)
|
REGISTER_TEST(TestVarID)
|
||||||
|
|
Loading…
Reference in New Issue