From: John McCall Date: Sat, 3 Jul 2010 18:33:00 +0000 (+0000) Subject: Mark the operator delete associated with a virtual destructor as referenced. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5efd91a3b58e59006f8a3e8c9256ec00c38dba95;p=clang Mark the operator delete associated with a virtual destructor as referenced. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107573 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 4dd5e3f30d..1d0264853c 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -2898,6 +2898,8 @@ bool Sema::CheckDestructor(CXXDestructorDecl *Destructor) { Context.DeclarationNames.getCXXOperatorName(OO_Delete); if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete)) return true; + + MarkDeclarationReferenced(Loc, OperatorDelete); Destructor->setOperatorDelete(OperatorDelete); } diff --git a/test/SemaCXX/destructor.cpp b/test/SemaCXX/destructor.cpp index 3c63c3d36a..2c60b32204 100644 --- a/test/SemaCXX/destructor.cpp +++ b/test/SemaCXX/destructor.cpp @@ -88,3 +88,20 @@ namespace PR6709 { struct X0 { virtual ~X0() throw(); }; struct X1 : public X0 { }; + +// Make sure we instantiate operator deletes when building a virtual +// destructor. +namespace test6 { + template class A { + public: + void *operator new(unsigned long); + void operator delete(void *p) { + T::deleteIt(p); // expected-error {{type 'int' cannot be used prior to '::'}} + } + + virtual ~A() {} // expected-note {{in instantiation of member function 'test6::A::operator delete' requested here}} + }; + + class B : A { B(); }; + B::B() {} +}