Skip to content

Commit f179e36

Browse files
committed
[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 llvm-svn: 242857
1 parent e171da5 commit f179e36

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

clang/lib/Sema/SemaExprMember.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,16 +1042,8 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType,
10421042
BaseExpr = new (Context) CXXThisExpr(Loc, BaseExprType,/*isImplicit=*/true);
10431043
}
10441044

1045-
bool ShouldCheckUse = true;
1046-
if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MemberDecl)) {
1047-
// Don't diagnose the use of a virtual member function unless it's
1048-
// explicitly qualified.
1049-
if (MD->isVirtual() && !SS.isSet())
1050-
ShouldCheckUse = false;
1051-
}
1052-
10531045
// Check the use of this member.
1054-
if (ShouldCheckUse && DiagnoseUseOfDecl(MemberDecl, MemberLoc))
1046+
if (DiagnoseUseOfDecl(MemberDecl, MemberLoc))
10551047
return ExprError();
10561048

10571049
if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))

clang/test/SemaCXX/attr-deprecated.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,12 @@ void A::h(A* a)
2626
}
2727

2828
struct B {
29-
virtual void f() __attribute__((deprecated)); // expected-note 4 {{'f' has been explicitly marked deprecated here}}
29+
virtual void f() __attribute__((deprecated)); // expected-note 6 {{'f' has been explicitly marked deprecated here}}
3030
void g();
3131
};
3232

3333
void B::g() {
34-
f();
34+
f(); // expected-warning{{'f' is deprecated}}
3535
B::f(); // expected-warning{{'f' is deprecated}}
3636
}
3737

@@ -47,7 +47,7 @@ void C::g() {
4747
}
4848

4949
void f(B* b, C *c) {
50-
b->f();
50+
b->f(); // expected-warning{{'f' is deprecated}}
5151
b->B::f(); // expected-warning{{'f' is deprecated}}
5252

5353
c->f();
@@ -59,10 +59,10 @@ struct D {
5959
virtual void f() __attribute__((deprecated));
6060
};
6161

62-
void D::f() { }
62+
void D::f() { } // expected-note{{'f' has been explicitly marked deprecated here}}
6363

6464
void f(D* d) {
65-
d->f();
65+
d->f(); // expected-warning{{'f' is deprecated}}
6666
}
6767

6868

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2+
3+
struct S {
4+
virtual void f() = delete; //expected-note{{'f' has been explicitly marked deleted here}}
5+
void g() { f(); } //expected-error{{attempt to use a deleted function}}
6+
};

0 commit comments

Comments
 (0)