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