summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn McCall <rjmccall@apple.com>2010-06-11 17:36:40 +0000
committerJohn McCall <rjmccall@apple.com>2010-06-11 17:36:40 +0000
commitb86a6b830ef733ef763f32dc135b6ed2e2a3faf6 (patch)
treeecb4a3e55d8de3279cf799c3ba0fdbc44cb86536
parent773cc98c3abb11e5f91197d5aa42944c476e7f06 (diff)
downloadbcm5719-llvm-b86a6b830ef733ef763f32dc135b6ed2e2a3faf6.tar.gz
bcm5719-llvm-b86a6b830ef733ef763f32dc135b6ed2e2a3faf6.zip
Allow pseudo-destructors to be called on qualified pointers. Patch by
Troy Straszheim! llvm-svn: 105823
-rw-r--r--clang/lib/Sema/SemaExprCXX.cpp2
-rw-r--r--clang/test/SemaCXX/pseudo-destructors.cpp12
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 1e5c3d8c382..4c93fba3844 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/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/clang/test/SemaCXX/pseudo-destructors.cpp b/clang/test/SemaCXX/pseudo-destructors.cpp
index 472e5b42fb2..30d9faac2e2 100644
--- a/clang/test/SemaCXX/pseudo-destructors.cpp
+++ b/clang/test/SemaCXX/pseudo-destructors.cpp
@@ -14,6 +14,11 @@ namespace N {
typedef int OtherInteger;
}
+template <typename T>
+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();
}
+
OpenPOWER on IntegriCloud