@@ -4168,46 +4168,65 @@ void CheckOther::checkShadowVariables()
41684168 const Scope *functionScope = &scope;
41694169 while (functionScope && functionScope->type != ScopeType::eFunction && functionScope->type != ScopeType::eLambda)
41704170 functionScope = functionScope->nestedIn ;
4171- for (const Variable &var : scope.varlist ) {
4172- if (var.nameToken () && var.nameToken ()->isExpandedMacro ()) // #8903
4173- continue ;
4171+ const auto checkVar = [&](const Variable &var) {
4172+ if (!var.nameToken ())
4173+ return ;
4174+
4175+ if (var.nameToken ()->isExpandedMacro ()) // #8903
4176+ return ;
41744177
4175- if (functionScope && functionScope->type == ScopeType::eFunction && functionScope->function ) {
4178+ if (!var. isArgument () && functionScope && functionScope->type == ScopeType::eFunction && functionScope->function ) {
41764179 const auto & argList = functionScope->function ->argumentList ;
41774180 auto it = std::find_if (argList.cbegin (), argList.cend (), [&](const Variable& arg) {
41784181 return arg.nameToken () && var.name () == arg.name ();
41794182 });
41804183 if (it != argList.end ()) {
4181- shadowError (var.nameToken (), it->nameToken (), " argument" );
4182- continue ;
4184+ shadowError (var.nameToken (), " local variable " , it->nameToken (), " argument" );
4185+ return ;
41834186 }
41844187 }
41854188
41864189 const Token *shadowed = findShadowed (scope.nestedIn , var, var.nameToken ()->linenr ());
41874190 if (!shadowed)
41884191 shadowed = findShadowed (scope.functionOf , var, var.nameToken ()->linenr ());
41894192 if (!shadowed)
4190- continue ;
4193+ return ;
41914194 if (scope.type == ScopeType::eFunction && scope.className == var.name ())
4192- continue ;
4195+ return ;
41934196 if (functionScope->functionOf && functionScope->functionOf ->isClassOrStructOrUnion () && functionScope->function &&
41944197 (functionScope->function ->isStatic () || functionScope->function ->isFriend ()) &&
41954198 shadowed->variable () && !shadowed->variable ()->isLocal ())
4196- continue ;
4197- shadowError (var.nameToken (), shadowed, (shadowed->varId () != 0 ) ? " variable" : " function" );
4198- }
4199+ return ;
4200+ if (var.scope () && var.scope ()->function && var.scope ()->function ->isConstructor ()) {
4201+ if (shadowed->variable () && shadowed->variable ()->isMember ())
4202+ return ;
4203+ if (shadowed->function () && shadowed->function ()->nestedIn &&
4204+ shadowed->function ()->nestedIn ->isClassOrStruct ())
4205+ return ;
4206+ }
4207+ shadowError (var.nameToken (), var.isArgument () ? " argument" : " local variable" ,
4208+ shadowed, (shadowed->varId () != 0 ) ?
4209+ (shadowed->variable ()->isMember () ? " member" : " variable" ) : " function" );
4210+ };
4211+ for (const Variable &var : scope.varlist )
4212+ checkVar (var);
4213+ if (functionScope && functionScope->type == ScopeType::eFunction && functionScope->function )
4214+ for (const Variable &arg: functionScope->function ->argumentList )
4215+ checkVar (arg);
41994216 }
42004217}
42014218
4202- void CheckOther::shadowError (const Token *var, const Token *shadowed, const std::string& type)
4219+ void CheckOther::shadowError (const Token *shadows, const std::string &shadowsType,
4220+ const Token *shadowed, const std::string &shadowedType)
42034221{
42044222 ErrorPath errorPath;
4205- errorPath.emplace_back (shadowed, " Shadowed declaration" );
4206- errorPath.emplace_back (var, " Shadow variable" );
4207- const std::string &varname = var ? var->str () : type;
4208- const std::string Type = char (std::toupper (type[0 ])) + type.substr (1 );
4209- const std::string id = " shadow" + Type;
4210- const std::string message = " $symbol:" + varname + " \n Local variable \' $symbol\' shadows outer " + type;
4223+ errorPath.emplace_back (shadowed, " Shadowed " + shadowedType);
4224+ errorPath.emplace_back (shadows, " Shadow " + shadowsType);
4225+ const std::string &varname = shadows ? shadows->str () : shadowsType;
4226+ const std::string ShadowsType = char (std::toupper (shadowsType[0 ])) + shadowsType.substr (1 );
4227+ const std::string ShadowedType = char (std::toupper (shadowedType[0 ])) + shadowedType.substr (1 );
4228+ const std::string id = " shadow" + ShadowedType;
4229+ const std::string message = " $symbol:" + varname + " \n " + ShadowsType + " \' $symbol\' shadows outer " + shadowedType;
42114230 reportError (std::move (errorPath), Severity::style, id.c_str (), message, CWE398, Certainty::normal);
42124231}
42134232
@@ -4889,9 +4908,10 @@ void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings *sett
48894908 c.accessMovedError (nullptr , " v" , nullptr , false );
48904909 c.funcArgNamesDifferent (" function" , 1 , nullptr , nullptr );
48914910 c.redundantBitwiseOperationInSwitchError (nullptr , " varname" );
4892- c.shadowError (nullptr , nullptr , " variable" );
4893- c.shadowError (nullptr , nullptr , " function" );
4894- c.shadowError (nullptr , nullptr , " argument" );
4911+ c.shadowError (nullptr , " local variable" , nullptr , " variable" );
4912+ c.shadowError (nullptr , " local variable" , nullptr , " argument" );
4913+ c.shadowError (nullptr , " local variable" , nullptr , " function" );
4914+ c.shadowError (nullptr , " local variable" , nullptr , " member" );
48954915 c.knownArgumentError (nullptr , nullptr , nullptr , " x" , false );
48964916 c.knownPointerToBoolError (nullptr , nullptr );
48974917 c.comparePointersError (nullptr , nullptr , nullptr );
0 commit comments