summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-02-22 17:06:41 +0000
committerDouglas Gregor <dgregor@apple.com>2010-02-22 17:06:41 +0000
commitd28f0412e40612785175c53def8ed2dee0ae1c0a (patch)
tree01d8a2e2e487bd07eea3f555c5878ec3e350dc1e
parentf4f2e0247f583d4eb91fb86a114e3f9eb79c34f4 (diff)
downloadbcm5719-llvm-d28f0412e40612785175c53def8ed2dee0ae1c0a.tar.gz
bcm5719-llvm-d28f0412e40612785175c53def8ed2dee0ae1c0a.zip
Do not require a complete type when checking for a pointer conversion
between cv1 T* and cv2 T*. llvm-svn: 96787
-rw-r--r--clang/lib/Sema/SemaOverload.cpp1
-rw-r--r--clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp21
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp
index 1c6fd17c381..b3b665c1b6d 100644
--- a/clang/lib/Sema/SemaOverload.cpp
+++ b/clang/lib/Sema/SemaOverload.cpp
@@ -1094,6 +1094,7 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType,
// here. That is handled by CheckPointerConversion.
if (getLangOptions().CPlusPlus &&
FromPointeeType->isRecordType() && ToPointeeType->isRecordType() &&
+ !Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType) &&
!RequireCompleteType(From->getLocStart(), FromPointeeType, PDiag()) &&
IsDerivedFrom(FromPointeeType, ToPointeeType)) {
ConvertedType = BuildSimilarlyQualifiedPointerType(FromTypePtr,
diff --git a/clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp b/clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp
index 44ce41b6f95..13822725b5b 100644
--- a/clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp
+++ b/clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp
@@ -12,3 +12,24 @@ template<typename T, typename U> void f0(T, U*) { }
template void f0<int>(int, float*);
template void f0<>(double, float*);
+
+template<typename T> struct hash { };
+struct S {
+ bool operator==(const S&) const { return false; }
+};
+
+template<typename T> struct Hash_map {
+ void Method(const T& x) { h(x); }
+ hash<T> h;
+};
+
+Hash_map<S> *x;
+const Hash_map<S> *foo() {
+ return x;
+}
+
+template<> struct hash<S> {
+ int operator()(const S& k) const {
+ return 0;
+ }
+};
OpenPOWER on IntegriCloud