path to ir-gen 12.3.1 Conversion by constructor



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80398 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp
index 61891e7..fe67ec6 100644
--- a/lib/Sema/SemaExprCXX.cpp
+++ b/lib/Sema/SemaExprCXX.cpp
@@ -920,9 +920,10 @@
     break;
 
   case ImplicitConversionSequence::UserDefinedConversion:
-      // FIXME. Support other kinds of user defined convesions.
-      if (CXXConversionDecl *CV = 
-            dyn_cast<CXXConversionDecl>(ICS.UserDefined.ConversionFunction))
+    {
+      FunctionDecl *FD = ICS.UserDefined.ConversionFunction;
+      CastExpr::CastKind CastKind = CastExpr::CK_Unknown;
+      if (CXXConversionDecl *CV = dyn_cast<CXXConversionDecl>(FD)) {
         // FIXME. Get actual Source Location.
         From = 
           new (Context) CXXFunctionalCastExpr(ToType.getNonReferenceType(),
@@ -930,10 +931,22 @@
                                             CastExpr::CK_UserDefinedConversion,
                                             From, CV,
                                             SourceLocation());
-    ImpCastExprToType(From, ToType.getNonReferenceType(), 
-                      CastExpr::CK_Unknown,
-                      ToType->isLValueReferenceType());
-    return false;
+        CastKind = CastExpr::CK_UserDefinedConversion;
+      }
+      else if (CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(FD)) {
+        // FIXME. Do we need to check for isLValueReferenceType?
+        DefaultFunctionArrayConversion(From);
+        OwningExprResult InitResult = 
+          BuildCXXConstructExpr(ToType.getNonReferenceType(), 
+                                CD, &From, 1);
+        From = InitResult.takeAs<Expr>();
+        CastKind = CastExpr::CK_ConstructorConversion ;
+      }
+      ImpCastExprToType(From, ToType.getNonReferenceType(),
+                        CastKind,
+                        ToType->isLValueReferenceType());
+      return false;
+    }
 
   case ImplicitConversionSequence::EllipsisConversion:
     assert(false && "Cannot perform an ellipsis conversion");