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

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 10 16:52:41 PDT 2017


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170810/85f1e54f/attachment-0001.html>


More information about the cfe-commits mailing list