r309569 - Fix -Wshadow false positives with function-local classes.

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 10 18:02:01 PDT 2017


r310674. Thanks!

On Thu, Aug 10, 2017 at 4:52 PM, Richard Smith <richard at metafoo.co.uk> wrote:
> Seems reasonable to me.
>
> On 10 August 2017 at 14:28, Hans Wennborg via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
>>
>> 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
>> _______________________________________________
>> 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