diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 4476814fcbb..9b6661057fd 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -4221,12 +4221,12 @@ void CheckOtherImpl::funcArgOrderDifferent(const std::string & functionName, reportError(tokens, Severity::warning, "funcArgOrderDifferent", msg, CWE683, Certainty::normal); } -static const Token *findShadowed(const Scope *scope, const Variable& var, int linenr) +static const Token *findShadowed(const Scope *scope, const Variable& var) { if (!scope) return nullptr; for (const Variable &v : scope->varlist) { - if (scope->isExecutable() && v.nameToken()->linenr() > linenr) + if ((scope->isExecutable() || scope->type == ScopeType::eGlobal) && succeeds(v.nameToken(), var.nameToken())) continue; if (v.name() == var.name()) return v.nameToken(); @@ -4240,9 +4240,9 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li if (scope->type == ScopeType::eLambda) return nullptr; - const Token* shadowed = findShadowed(scope->nestedIn, var, linenr); + const Token* shadowed = findShadowed(scope->nestedIn, var); if (!shadowed) - shadowed = findShadowed(scope->functionOf, var, linenr); + shadowed = findShadowed(scope->functionOf, var); return shadowed; } @@ -4276,9 +4276,9 @@ void CheckOtherImpl::checkShadowVariables() } } - const Token *shadowed = findShadowed(scope.nestedIn, var, var.nameToken()->linenr()); + const Token *shadowed = findShadowed(scope.nestedIn, var); if (!shadowed) - shadowed = findShadowed(scope.functionOf, var, var.nameToken()->linenr()); + shadowed = findShadowed(scope.functionOf, var); if (!shadowed) return; if (scope.type == ScopeType::eFunction && scope.className == var.name()) @@ -4312,9 +4312,10 @@ void CheckOtherImpl::checkShadowVariables() void CheckOtherImpl::shadowError(const Token *shadows, const std::string &shadowsType, const Token *shadowed, const std::string &shadowedType) { - ErrorPath errorPath; - errorPath.emplace_back(shadowed, "Shadowed " + shadowedType); - errorPath.emplace_back(shadows, "Shadow " + shadowsType); + ErrorPath errorPath{ + {shadowed, "Shadowed " + shadowedType}, + {shadows, "Shadow " + shadowsType} + }; const std::string &varname = shadows ? shadows->str() : shadowsType; const std::string ShadowsType = char(std::toupper(shadowsType[0])) + shadowsType.substr(1); const std::string ShadowedType = char(std::toupper(shadowedType[0])) + shadowedType.substr(1); diff --git a/test/testother.cpp b/test/testother.cpp index 60c2a3bc528..6e525ef39bd 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -13520,6 +13520,24 @@ class TestOther : public TestFixture { check("struct S { void g(float f) {} void f() {} };\n"); ASSERT_EQUALS("[test.cpp:1:36] -> [test.cpp:1:25]: (style) Argument 'f' shadows outer function [shadowFunction]\n", errout_str()); + + check("int f() {\n" // #15114 + " int i = 0;\n" + " return i;\n" + "}\n" + "int i = 1;\n"); + ASSERT_EQUALS("", errout_str()); + + { + ScopedFile inc("test.h", "int pad1;\nint pad2;\nint pad3;\nint pad4;\nfloat f;\n"); + checkP("void g() {\n" + " #include \"test.h\"\n" + " {\n" + " float f;\n" + " }\n" + "}\n"); + ASSERT_EQUALS("[test.h:5:7] -> [test.cpp:4:15]: (style) Local variable 'f' shadows outer variable [shadowVariable]\n", errout_str()); + } } void knownArgument() {