r309569 - Fix -Wshadow false positives with function-local classes.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Thu Aug 10 14:28:25 PDT 2017
Should we merge this to 5.0?
On Mon, Jul 31, 2017 at 8:21 AM, Alexander Kornienko via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: alexfh
> Date: Mon Jul 31 08:21:26 2017
> New Revision: 309569
>
> URL: http://llvm.org/viewvc/llvm-project?rev=309569&view=rev
> Log:
> Fix -Wshadow false positives with function-local classes.
>
> Summary:
> Fixes http://llvm.org/PR33947.
>
> https://godbolt.org/g/54XRMT
>
> void f(int a) {
> struct A {
> void g(int a) {}
> A() { int a; }
> };
> }
>
> 3 : <source>:3:16: warning: declaration shadows a local variable [-Wshadow]
> void g(int a) {}
> ^
> 1 : <source>:1:12: note: previous declaration is here
> void f(int a) {
> ^
> 4 : <source>:4:15: warning: declaration shadows a local variable [-Wshadow]
> A() { int a; }
> ^
> 1 : <source>:1:12: note: previous declaration is here
> void f(int a) {
> ^
> 2 warnings generated.
>
> The local variable `a` of the function `f` can't be accessed from a method of
> the function-local class A, thus no shadowing occurs and no diagnostic is
> needed.
>
> Reviewers: rnk, rsmith, arphaman, Quuxplusone
>
> Reviewed By: rnk, Quuxplusone
>
> Subscribers: Quuxplusone, cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D35941
>
> Modified:
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/test/SemaCXX/warn-shadow.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=309569&r1=309568&r2=309569&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jul 31 08:21:26 2017
> @@ -6999,6 +6999,21 @@ void Sema::CheckShadow(NamedDecl *D, Nam
> return;
> }
> }
> +
> + if (cast<VarDecl>(ShadowedDecl)->hasLocalStorage()) {
> + // A variable can't shadow a local variable in an enclosing scope, if
> + // they are separated by a non-capturing declaration context.
> + for (DeclContext *ParentDC = NewDC;
> + ParentDC && !ParentDC->Equals(OldDC);
> + ParentDC = getLambdaAwareParentOfDeclContext(ParentDC)) {
> + // Only block literals, captured statements, and lambda expressions
> + // can capture; other scopes don't.
> + if (!isa<BlockDecl>(ParentDC) && !isa<CapturedDecl>(ParentDC) &&
> + !isLambdaCallOperator(ParentDC)) {
> + return;
> + }
> + }
> + }
> }
> }
>
>
> Modified: cfe/trunk/test/SemaCXX/warn-shadow.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-shadow.cpp?rev=309569&r1=309568&r2=309569&view=diff
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/warn-shadow.cpp (original)
> +++ cfe/trunk/test/SemaCXX/warn-shadow.cpp Mon Jul 31 08:21:26 2017
> @@ -213,3 +213,12 @@ typedef int externC; // expected-note {{
> void handleLinkageSpec() {
> typedef void externC; // expected-warning {{declaration shadows a typedef in the global namespace}}
> }
> +
> +namespace PR33947 {
> +void f(int a) {
> + struct A {
> + void g(int a) {}
> + A() { int a; }
> + };
> +}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list