diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-22 17:06:41 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-22 17:06:41 +0000 |
commit | d28f0412e40612785175c53def8ed2dee0ae1c0a (patch) | |
tree | 01d8a2e2e487bd07eea3f555c5878ec3e350dc1e | |
parent | f4f2e0247f583d4eb91fb86a114e3f9eb79c34f4 (diff) | |
download | bcm5719-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.cpp | 1 | ||||
-rw-r--r-- | clang/test/CXX/temp/temp.spec/temp.explicit/p6.cpp | 21 |
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; + } +}; |