@@ -1205,14 +1205,23 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12051205{
12061206 VarIdMap varIds;
12071207
1208+ auto setMemberVar = [&](const Variable* membervar, Token* membertok, const Token* vartok) -> void {
1209+ if (membervar) {
1210+ membertok->variable (membervar);
1211+ if (vartok && (membertok->varId () == 0 || mVariableList [membertok->varId ()] == nullptr ))
1212+ fixVarId (varIds, vartok, membertok, membervar);
1213+ }
1214+ };
1215+
12081216 // Set variable pointers
12091217 for (const Token* tok = mTokenizer ->list .front (); tok != mTokenizer ->list .back (); tok = tok->next ()) {
12101218 if (tok->varId ())
1211- const_cast <Token *>(tok)->variable (getVariableFromVarId (tok->varId ()));
1219+ const_cast <Token*>(tok)->variable (getVariableFromVarId (tok->varId ()));
12121220
12131221 // Set Token::variable pointer for array member variable
12141222 // Since it doesn't point at a fixed location it doesn't have varid
1215- const bool isVar = tok->variable () && (tok->variable ()->typeScope () || tok->variable ()->isSmartPointer () || (tok->valueType () && tok->valueType ()->type == ValueType::CONTAINER));
1223+ const bool isVar = tok->variable () && (tok->variable ()->typeScope () || tok->variable ()->isSmartPointer () ||
1224+ (tok->valueType () && (tok->valueType ()->type == ValueType::CONTAINER || tok->valueType ()->type == ValueType::ITERATOR)));
12161225 const bool isArrayAccess = isVar && Token::simpleMatch (tok->astParent (), " [" );
12171226 const bool isDirectAccess = isVar && !isArrayAccess && Token::simpleMatch (tok->astParent (), " ." );
12181227 const bool isDerefAccess = isVar && !isDirectAccess && Token::simpleMatch (tok->astParent (), " *" ) && Token::simpleMatch (tok->astParent ()->astParent (), " ." );
@@ -1247,19 +1256,11 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12471256 const Variable *var = tok->variable ();
12481257 if (var->typeScope ()) {
12491258 const Variable *membervar = var->typeScope ()->getVariable (membertok->str ());
1250- if (membervar) {
1251- membertok->variable (membervar);
1252- if (membertok->varId () == 0 || mVariableList [membertok->varId ()] == nullptr )
1253- fixVarId (varIds, tok, const_cast <Token *>(membertok), membervar);
1254- }
1259+ setMemberVar (membervar, membertok, tok);
12551260 } else if (const ::Type *type = var->smartPointerType ()) {
12561261 const Scope *classScope = type->classScope ;
12571262 const Variable *membervar = classScope ? classScope->getVariable (membertok->str ()) : nullptr ;
1258- if (membervar) {
1259- membertok->variable (membervar);
1260- if (membertok->varId () == 0 || mVariableList [membertok->varId ()] == nullptr )
1261- fixVarId (varIds, tok, const_cast <Token *>(membertok), membervar);
1262- }
1263+ setMemberVar (membervar, membertok, tok);
12631264 } else if (tok->valueType () && tok->valueType ()->type == ValueType::CONTAINER) {
12641265 if (Token::Match (var->typeStartToken (), " std :: %type% < %name%" )) {
12651266 const Token* type2tok = var->typeStartToken ()->tokAt (4 );
@@ -1268,13 +1269,14 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12681269 const Type* type2 = type2tok ? type2tok->type () : nullptr ;
12691270 if (type2 && type2->classScope && type2->classScope ->definedType ) {
12701271 const Variable *membervar = type2->classScope ->getVariable (membertok->str ());
1271- if (membervar) {
1272- membertok->variable (membervar);
1273- if (membertok->varId () == 0 || mVariableList [membertok->varId ()] == nullptr )
1274- fixVarId (varIds, tok, const_cast <Token *>(membertok), membervar);
1275- }
1272+ setMemberVar (membervar, membertok, tok);
12761273 }
12771274 }
1275+ } else if (const Type* iterType = var->iteratorType ()) {
1276+ if (iterType->classScope && iterType->classScope ->definedType ) {
1277+ const Variable *membervar = iterType->classScope ->getVariable (membertok->str ());
1278+ setMemberVar (membervar, membertok, tok);
1279+ }
12781280 }
12791281 }
12801282 }
@@ -1296,13 +1298,7 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12961298 if (!membervar) {
12971299 if (type->classScope ) {
12981300 membervar = type->classScope ->getVariable (membertok->str ());
1299- if (membervar) {
1300- membertok->variable (membervar);
1301- if (membertok->varId () == 0 || mVariableList [membertok->varId ()] == nullptr ) {
1302- if (tok->function ()->retDef )
1303- fixVarId (varIds, tok->function ()->retDef , const_cast <Token *>(membertok), membervar);
1304- }
1305- }
1301+ setMemberVar (membervar, membertok, tok->function ()->retDef );
13061302 }
13071303 }
13081304 }
@@ -2262,6 +2258,17 @@ const Type *Variable::smartPointerType() const
22622258 return nullptr ;
22632259}
22642260
2261+ const Type* Variable::iteratorType () const
2262+ {
2263+ if (!mValueType || mValueType ->type != ValueType::ITERATOR)
2264+ return nullptr ;
2265+
2266+ if (mValueType ->containerTypeToken )
2267+ return mValueType ->containerTypeToken ->type ();
2268+
2269+ return nullptr ;
2270+ }
2271+
22652272std::string Variable::getTypeName () const
22662273{
22672274 std::string ret;
0 commit comments