Parser; fixed ast and auto type deduction for c++17 braced init lists
This commit is contained in:
parent
9ad7ab4263
commit
4f43dbf954
|
@ -5770,6 +5770,15 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// c++17 auto type deduction of braced init list
|
||||||
|
if (mIsCpp && mSettings->standards.cpp >= Standards::CPP17 && vt2 && Token::Match(parent->tokAt(-2), "auto %var% {")) {
|
||||||
|
Token *autoTok = parent->tokAt(-2);
|
||||||
|
setValueType(autoTok, *vt2);
|
||||||
|
setAutoTokenProperties(autoTok);
|
||||||
|
const_cast<Variable *>(parent->previous()->variable())->setValueType(*vt2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!vt1)
|
if (!vt1)
|
||||||
return;
|
return;
|
||||||
if (parent->astOperand2() && !vt2)
|
if (parent->astOperand2() && !vt2)
|
||||||
|
|
|
@ -1593,6 +1593,7 @@ static Token * createAstAtToken(Token *tok, bool cpp)
|
||||||
(cpp && tok->str() == "throw") ||
|
(cpp && tok->str() == "throw") ||
|
||||||
!tok->previous() ||
|
!tok->previous() ||
|
||||||
Token::Match(tok, "%name% %op%|(|[|.|::|<|?|;") ||
|
Token::Match(tok, "%name% %op%|(|[|.|::|<|?|;") ||
|
||||||
|
(cpp && Token::Match(tok, "%name% {") && iscpp11init(tok->next())) ||
|
||||||
Token::Match(tok->previous(), "[;{}] %cop%|++|--|( !!{") ||
|
Token::Match(tok->previous(), "[;{}] %cop%|++|--|( !!{") ||
|
||||||
Token::Match(tok->previous(), "[;{}] %num%|%str%|%char%")) {
|
Token::Match(tok->previous(), "[;{}] %num%|%str%|%char%")) {
|
||||||
if (cpp && (Token::Match(tok->tokAt(-2), "[;{}] new|delete %name%") || Token::Match(tok->tokAt(-3), "[;{}] :: new|delete %name%")))
|
if (cpp && (Token::Match(tok->tokAt(-2), "[;{}] new|delete %name%") || Token::Match(tok->tokAt(-3), "[;{}] :: new|delete %name%")))
|
||||||
|
|
|
@ -468,6 +468,7 @@ private:
|
||||||
TEST_CASE(auto12); // #8993 - const std::string &x; auto y = x; if (y.empty()) ..
|
TEST_CASE(auto12); // #8993 - const std::string &x; auto y = x; if (y.empty()) ..
|
||||||
TEST_CASE(auto13);
|
TEST_CASE(auto13);
|
||||||
TEST_CASE(auto14);
|
TEST_CASE(auto14);
|
||||||
|
TEST_CASE(auto15); // C++17 auto deduction from braced-init-list
|
||||||
|
|
||||||
TEST_CASE(unionWithConstructor);
|
TEST_CASE(unionWithConstructor);
|
||||||
|
|
||||||
|
@ -8147,6 +8148,18 @@ private:
|
||||||
ASSERT(tok && !tok->valueType());
|
ASSERT(tok && !tok->valueType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void auto15() {
|
||||||
|
GET_SYMBOL_DB("auto var1{3};\n"
|
||||||
|
"auto var2{4.0};");
|
||||||
|
ASSERT_EQUALS(3, db->variableList().size());
|
||||||
|
const Variable *var1 = db->variableList()[1];
|
||||||
|
ASSERT(var1->valueType());
|
||||||
|
ASSERT_EQUALS(ValueType::Type::INT, var1->valueType()->type);
|
||||||
|
const Variable *var2 = db->variableList()[2];
|
||||||
|
ASSERT(var2->valueType());
|
||||||
|
ASSERT_EQUALS(ValueType::Type::DOUBLE, var2->valueType()->type);
|
||||||
|
}
|
||||||
|
|
||||||
void unionWithConstructor() {
|
void unionWithConstructor() {
|
||||||
GET_SYMBOL_DB("union Fred {\n"
|
GET_SYMBOL_DB("union Fred {\n"
|
||||||
" Fred(int x) : i(x) { }\n"
|
" Fred(int x) : i(x) { }\n"
|
||||||
|
|
|
@ -5698,6 +5698,7 @@ private:
|
||||||
ASSERT_EQUALS("stdvector::", testAst("std::vector<std::vector<int>>{{},{}}"));
|
ASSERT_EQUALS("stdvector::", testAst("std::vector<std::vector<int>>{{},{}}"));
|
||||||
ASSERT_EQUALS("abR{{,P(,((", testAst("a(b(R{},{},P()));"));
|
ASSERT_EQUALS("abR{{,P(,((", testAst("a(b(R{},{},P()));"));
|
||||||
ASSERT_EQUALS("f1{2{,3{,{x,(", testAst("f({{1},{2},{3}},x);"));
|
ASSERT_EQUALS("f1{2{,3{,{x,(", testAst("f({{1},{2},{3}},x);"));
|
||||||
|
ASSERT_EQUALS("a1{ b2{", testAst("auto a{1}; auto b{2};"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void astbrackets() { // []
|
void astbrackets() { // []
|
||||||
|
|
Loading…
Reference in New Issue