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