From 5efd91a3b58e59006f8a3e8c9256ec00c38dba95 Mon Sep 17 00:00:00 2001 From: John McCall Date: Sat, 3 Jul 2010 18:33:00 +0000 Subject: [PATCH] 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 --- lib/Sema/SemaDeclCXX.cpp | 2 ++ test/SemaCXX/destructor.cpp | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) 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() {} +} -- 2.40.0