Should we merge this to 5.0?
On Mon, Jul 31, 2017 at 8:21 AM, Alexander Kornienko via cfe-commits <cfe-commits@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@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits