davide created this revision. davide added reviewers: rsmith, mclow.lists. davide added a subscriber: cfe-commits.
I originally tried to fix this in SemaExpr (ActOnCallExpr), putting this check just before BuildCallToMemberFunction() call, but eventaully convinced myself SemaOverload should be the right place to fix. Thanks, -- Davide http://reviews.llvm.org/D11334 Files: lib/Sema/SemaOverload.cpp test/SemaCXX/deleted-function-access.cpp Index: test/SemaCXX/deleted-function-access.cpp =================================================================== --- test/SemaCXX/deleted-function-access.cpp +++ test/SemaCXX/deleted-function-access.cpp @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s + +struct S { virtual void f() = delete; + void g() { f(); } }; //expected-error{{call to deleted member function f}} Index: lib/Sema/SemaOverload.cpp =================================================================== --- lib/Sema/SemaOverload.cpp +++ lib/Sema/SemaOverload.cpp @@ -11604,6 +11604,15 @@ FoundDecl = MemExpr->getFoundDecl(); Qualifier = MemExpr->getQualifier(); UnbridgedCasts.restore(); + + // Calls to deleted member functions are verboten. + if (Method && Method->isDeleted()) { + Diag(MemExpr->getLocStart(), diag::err_ovl_deleted_member_call) + << true /* isDeleted */ + << Method->getName() + << std::string() /* getDeletedOrUnavailableSuffix */ + << MemExpr->getSourceRange(); + } } else { UnresolvedMemberExpr *UnresExpr = cast<UnresolvedMemberExpr>(NakedMemExpr); Qualifier = UnresExpr->getQualifier();
Index: test/SemaCXX/deleted-function-access.cpp =================================================================== --- test/SemaCXX/deleted-function-access.cpp +++ test/SemaCXX/deleted-function-access.cpp @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s + +struct S { virtual void f() = delete; + void g() { f(); } }; //expected-error{{call to deleted member function f}} Index: lib/Sema/SemaOverload.cpp =================================================================== --- lib/Sema/SemaOverload.cpp +++ lib/Sema/SemaOverload.cpp @@ -11604,6 +11604,15 @@ FoundDecl = MemExpr->getFoundDecl(); Qualifier = MemExpr->getQualifier(); UnbridgedCasts.restore(); + + // Calls to deleted member functions are verboten. + if (Method && Method->isDeleted()) { + Diag(MemExpr->getLocStart(), diag::err_ovl_deleted_member_call) + << true /* isDeleted */ + << Method->getName() + << std::string() /* getDeletedOrUnavailableSuffix */ + << MemExpr->getSourceRange(); + } } else { UnresolvedMemberExpr *UnresExpr = cast<UnresolvedMemberExpr>(NakedMemExpr); Qualifier = UnresExpr->getQualifier();
_______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits