r242857 - [Sema] Diagnose use of declaration correctly.

Richard Smith richard at metafoo.co.uk
Tue Jul 21 17:37:45 PDT 2015


On Tue, Jul 21, 2015 at 5:30 PM, Davide Italiano <davide at freebsd.org> wrote:

> Author: davide
> Date: Tue Jul 21 19:30:58 2015
> New Revision: 242857
>
> URL: http://llvm.org/viewvc/llvm-project?rev=242857&view=rev
> Log:
> [Sema] Diagnose use of declaration correctly.
>
> Before we skipped that for virtual functions not fully qualified (r81507).
> This commit basically reverts this to the older behaviour, which seems
> more consistent. We now also correctly consider ill-formed calls to deleted
> member functions, which were silently passed before in some cases.
> The review contains the whole discussion.
>
> PR:             20268
> Differential Revision:   http://reviews.llvm.org/D11334
>
> Added:
>     cfe/trunk/test/SemaCXX/deleted-function-access.cpp
> Modified:
>     cfe/trunk/lib/Sema/SemaExprMember.cpp
>     cfe/trunk/test/SemaCXX/attr-deprecated.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=242857&r1=242856&r2=242857&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Tue Jul 21 19:30:58 2015
> @@ -1042,16 +1042,8 @@ Sema::BuildMemberReferenceExpr(Expr *Bas
>      BaseExpr = new (Context) CXXThisExpr(Loc,
> BaseExprType,/*isImplicit=*/true);
>    }
>
> -  bool ShouldCheckUse = true;
> -  if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MemberDecl)) {
> -    // Don't diagnose the use of a virtual member function unless it's
> -    // explicitly qualified.
> -    if (MD->isVirtual() && !SS.isSet())
> -      ShouldCheckUse = false;
> -  }
> -
>    // Check the use of this member.
> -  if (ShouldCheckUse && DiagnoseUseOfDecl(MemberDecl, MemberLoc))
> +  if (DiagnoseUseOfDecl(MemberDecl, MemberLoc))
>      return ExprError();
>
>    if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))
>
> Modified: cfe/trunk/test/SemaCXX/attr-deprecated.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-deprecated.cpp?rev=242857&r1=242856&r2=242857&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/attr-deprecated.cpp (original)
> +++ cfe/trunk/test/SemaCXX/attr-deprecated.cpp Tue Jul 21 19:30:58 2015
> @@ -26,12 +26,12 @@ void A::h(A* a)
>  }
>
>  struct B {
> -  virtual void f() __attribute__((deprecated)); // expected-note 4 {{'f'
> has been explicitly marked deprecated here}}
> +  virtual void f() __attribute__((deprecated)); // expected-note 6 {{'f'
> has been explicitly marked deprecated here}}
>    void g();
>  };
>
>  void B::g() {
> -  f();
> +  f(); // expected-warning{{'f' is deprecated}}
>    B::f(); // expected-warning{{'f' is deprecated}}
>  }
>
> @@ -47,7 +47,7 @@ void C::g() {
>  }
>
>  void f(B* b, C *c) {
> -  b->f();
> +  b->f(); // expected-warning{{'f' is deprecated}}
>    b->B::f(); // expected-warning{{'f' is deprecated}}
>
>    c->f();
> @@ -59,10 +59,10 @@ struct D {
>    virtual void f() __attribute__((deprecated));
>  };
>
> -void D::f() { }
> +void D::f() { } // expected-note{{'f' has been explicitly marked
> deprecated here}}
>
>  void f(D* d) {
> -  d->f();
> +  d->f(); // expected-warning{{'f' is deprecated}}
>  }
>

Can you also add some tests here for the case where the deprecated virtual
function is overloaded?

Added: cfe/trunk/test/SemaCXX/deleted-function-access.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/deleted-function-access.cpp?rev=242857&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/deleted-function-access.cpp (added)
> +++ cfe/trunk/test/SemaCXX/deleted-function-access.cpp Tue Jul 21 19:30:58
> 2015
> @@ -0,0 +1,6 @@
> +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
> +
> +struct S {
> +    virtual void f() = delete; //expected-note{{'f' has been explicitly
> marked deleted here}}
> +    void g() { f(); } //expected-error{{attempt to use a deleted
> function}}
> +};
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150721/65b9cfc0/attachment.html>


More information about the cfe-commits mailing list