Seems reasonable to me. On 10 August 2017 at 14:28, Hans Wennborg via cfe-commits < cfe-commits@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@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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits