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