Standard conversion sequences now have a CopyConstructor field, to
cope with the case where a user-defined conversion is actually a copy
construction, and therefore can be compared against other standard
conversion sequences. While I called this a hack before, now I'm
convinced that it's the right way to go.

Compare overloads based on derived-to-base conversions that invoke
copy constructors. 

Suppress user-defined conversions when attempting to call a
user-defined conversion.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58629 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 99b0829..fde2852 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -929,6 +929,13 @@
   // anything here.
   QualType FromType = From->getType();
 
+  if (SCS.CopyConstructor) {
+    // FIXME: Create a temporary object by calling the copy
+    // constructor.
+    ImpCastExprToType(From, ToType);
+    return false;
+  }
+
   // Perform the first implicit conversion.
   switch (SCS.First) {
   case ICK_Identity:
@@ -982,13 +989,6 @@
     ImpCastExprToType(From, FromType);
     break;
 
-  case ICK_Derived_To_Base:
-    // FIXME: This should never happen. It's a consequence of
-    // pretending that a user-defined conversion via copy constructor
-    // is actually a standard conversion.
-    ImpCastExprToType(From, ToType);
-    break;
-
   default:
     assert(false && "Improper second standard conversion");
     break;