Add support for auto variables in regular for loop.
This commit is contained in:
parent
5c7b1c7ff2
commit
78ad9825af
|
@ -4621,9 +4621,9 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype)
|
|||
Token::Match(parent->tokAt(-1), "%var% ="))) {
|
||||
Token *var1Tok = parent->strAt(-2) == ";" ? parent->tokAt(-3) : parent->tokAt(-1);
|
||||
Token *autoTok = nullptr;
|
||||
if (Token::Match(var1Tok->tokAt(-2), ";|{|}|const auto"))
|
||||
if (Token::Match(var1Tok->tokAt(-2), ";|{|}|(|const auto"))
|
||||
autoTok = var1Tok->previous();
|
||||
else if (Token::Match(var1Tok->tokAt(-3), ";|{|}|const auto *"))
|
||||
else if (Token::Match(var1Tok->tokAt(-3), ";|{|}|(|const auto *"))
|
||||
autoTok = var1Tok->tokAt(-2);
|
||||
if (autoTok) {
|
||||
ValueType vt(*vt2);
|
||||
|
@ -4635,11 +4635,11 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype)
|
|||
setAutoTokenProperties(autoTok);
|
||||
setValueType(var1Tok, *vt2);
|
||||
setValueType(parent->previous(), *vt2);
|
||||
const Variable *var = parent->previous()->variable();
|
||||
Variable *var = const_cast<Variable *>(parent->previous()->variable());
|
||||
if (var) {
|
||||
const_cast<Variable *>(var)->setFlags(*vt2);
|
||||
var->setFlags(*vt2);
|
||||
if (vt2->typeScope && vt2->typeScope->definedType) {
|
||||
const_cast<Variable *>(var)->type(vt2->typeScope->definedType);
|
||||
var->type(vt2->typeScope->definedType);
|
||||
if (autoTok->valueType()->pointer == 0)
|
||||
autoTok->type(vt2->typeScope->definedType);
|
||||
}
|
||||
|
|
|
@ -328,6 +328,7 @@ private:
|
|||
TEST_CASE(auto5);
|
||||
TEST_CASE(auto6); // #7963 (segmentation fault)
|
||||
TEST_CASE(auto7);
|
||||
TEST_CASE(auto8);
|
||||
}
|
||||
|
||||
void array() {
|
||||
|
@ -5111,6 +5112,31 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void auto8() {
|
||||
GET_SYMBOL_DB("std::vector<int> vec;\n"
|
||||
"void foo() {\n"
|
||||
" for (auto it = vec.begin(); it != vec.end(); ++it) { }\n"
|
||||
"}");
|
||||
const Token *autotok = Token::findsimplematch(tokenizer.tokens(), "auto it");
|
||||
|
||||
ASSERT(db && autotok && autotok->valueType());
|
||||
if (db && autotok && autotok->valueType()) {
|
||||
ASSERT_EQUALS(0, autotok->valueType()->constness);
|
||||
ASSERT_EQUALS(0, autotok->valueType()->pointer);
|
||||
ASSERT_EQUALS(ValueType::UNKNOWN_SIGN, autotok->valueType()->sign);
|
||||
ASSERT_EQUALS(ValueType::ITERATOR, autotok->valueType()->type);
|
||||
}
|
||||
|
||||
vartok = Token::findsimplematch(autotok, "it =");
|
||||
ASSERT(db && vartok && vartok->valueType());
|
||||
if (db && vartok && vartok->valueType()) {
|
||||
ASSERT_EQUALS(0, vartok->valueType()->constness);
|
||||
ASSERT_EQUALS(0, vartok->valueType()->pointer);
|
||||
ASSERT_EQUALS(ValueType::UNKNOWN_SIGN, vartok->valueType()->sign);
|
||||
ASSERT_EQUALS(ValueType::ITERATOR, vartok->valueType()->type);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
REGISTER_TEST(TestSymbolDatabase)
|
||||
|
|
Loading…
Reference in New Issue