]> granicus.if.org Git - clang/commitdiff
Do not require a complete type when checking for a pointer conversion
authorDouglas Gregor <dgregor@apple.com>
Mon, 22 Feb 2010 17:06:41 +0000 (17:06 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 22 Feb 2010 17:06:41 +0000 (17:06 +0000)
between cv1 T* and cv2 T*.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@96787 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/CXX/temp/temp.spec/temp.explicit/p6.cpp

index 1c6fd17c381361a0b344aa7a4e1fc664d52c7bd9..b3b665c1b6dfc3070ce1a3e822baaaa85b0d7d4e 100644 (file)
@@ -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,
index 44ce41b6f957c26ab4df788dc9b5b5b5da7654a3..13822725b5bd93bac1881dd2e8fa7efd594022cb 100644 (file)
@@ -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;
+  }
+};