From 3928480e596ea2f53350a95eb37bd871eba03f46 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Wed, 22 Jul 2015 00:30:58 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@242857 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprMember.cpp | 10 +--------- test/SemaCXX/attr-deprecated.cpp | 10 +++++----- test/SemaCXX/deleted-function-access.cpp | 6 ++++++ 3 files changed, 12 insertions(+), 14 deletions(-) create mode 100644 test/SemaCXX/deleted-function-access.cpp diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index a9f1919e18..94716b4a71 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -1042,16 +1042,8 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, BaseExpr = new (Context) CXXThisExpr(Loc, BaseExprType,/*isImplicit=*/true); } - bool ShouldCheckUse = true; - if (CXXMethodDecl *MD = dyn_cast(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(MemberDecl)) diff --git a/test/SemaCXX/attr-deprecated.cpp b/test/SemaCXX/attr-deprecated.cpp index d28eb75cca..4066dc16d6 100644 --- a/test/SemaCXX/attr-deprecated.cpp +++ b/test/SemaCXX/attr-deprecated.cpp @@ -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}} } diff --git a/test/SemaCXX/deleted-function-access.cpp b/test/SemaCXX/deleted-function-access.cpp new file mode 100644 index 0000000000..f355e41ae6 --- /dev/null +++ b/test/SemaCXX/deleted-function-access.cpp @@ -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}} +}; -- 2.40.0