From 81e317a444dd756a1cafe94031e4b3f3c138dac6 Mon Sep 17 00:00:00 2001 From: John McCall Date: Fri, 11 Jun 2010 17:36:40 +0000 Subject: [PATCH] Allow pseudo-destructors to be called on qualified pointers. Patch by Troy Straszheim! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105823 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExprCXX.cpp | 2 +- test/SemaCXX/pseudo-destructors.cpp | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 1e5c3d8c38..4c93fba384 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -2841,7 +2841,7 @@ Sema::OwningExprResult Sema::BuildPseudoDestructorExpr(ExprArg Base, if (ScopeTypeInfo) { QualType ScopeType = ScopeTypeInfo->getType(); if (!ScopeType->isDependentType() && !ObjectType->isDependentType() && - !Context.hasSameType(ScopeType, ObjectType)) { + !Context.hasSameUnqualifiedType(ScopeType, ObjectType)) { Diag(ScopeTypeInfo->getTypeLoc().getLocalSourceRange().getBegin(), diag::err_pseudo_dtor_type_mismatch) diff --git a/test/SemaCXX/pseudo-destructors.cpp b/test/SemaCXX/pseudo-destructors.cpp index 472e5b42fb..30d9faac2e 100644 --- a/test/SemaCXX/pseudo-destructors.cpp +++ b/test/SemaCXX/pseudo-destructors.cpp @@ -14,6 +14,11 @@ namespace N { typedef int OtherInteger; } +template +void cv_test(const volatile T* cvt) { + cvt->T::~T(); // no-warning +} + void f(A* a, Foo *f, int *i, double *d) { a->~A(); a->A::~A(); @@ -41,8 +46,14 @@ void f(A* a, Foo *f, int *i, double *d) { i->N::OtherInteger::~Integer(); // expected-error{{'Integer' does not refer to a type name in pseudo-destructor expression; expected the name of type 'int'}} i->N::~Integer(); // expected-error{{'Integer' does not refer to a type name in pseudo-destructor expression; expected the name of type 'int'}} i->Integer::~Double(); // expected-error{{the type of object expression ('int') does not match the type being destroyed ('Double' (aka 'double')) in pseudo-destructor expression}} + + cv_test(a); + cv_test(f); + cv_test(i); + cv_test(d); } + typedef int Integer; void destroy_without_call(int *ip) { @@ -57,3 +68,4 @@ namespace N1 { void test_X0(N1::X0 &x0) { x0.~X0(); } + -- 2.40.0