Now that we have copy initialization support, use it for checking the default arguments

llvm-svn: 58692
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index bd3da49..33fc52b 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -126,22 +126,14 @@
   //   the same semantic constraints as the initializer expression in
   //   a declaration of a variable of the parameter type, using the
   //   copy-initialization semantics (8.5).
-  //
-  // FIXME: CheckSingleAssignmentConstraints has the wrong semantics
-  // for C++ (since we want copy-initialization, not copy-assignment),
-  // but we don't have the right semantics implemented yet. Because of
-  // this, our error message is also very poor.
-  QualType DefaultArgType = DefaultArg->getType();   
   Expr *DefaultArgPtr = DefaultArg.get();
-  AssignConvertType ConvTy = CheckSingleAssignmentConstraints(ParamType,
-                                                              DefaultArgPtr);
+  bool DefaultInitFailed = PerformCopyInitialization(DefaultArgPtr, ParamType,
+                                                     "in default argument");
   if (DefaultArgPtr != DefaultArg.get()) {
     DefaultArg.take();
     DefaultArg.reset(DefaultArgPtr);
   }
-  if (DiagnoseAssignmentResult(ConvTy, DefaultArg->getLocStart(), 
-                               ParamType, DefaultArgType, DefaultArg.get(), 
-                               "in default argument")) {
+  if (DefaultInitFailed) {
     return;
   }
 
diff --git a/clang/test/SemaCXX/default1.cpp b/clang/test/SemaCXX/default1.cpp
index fe019c8..3acf119 100644
--- a/clang/test/SemaCXX/default1.cpp
+++ b/clang/test/SemaCXX/default1.cpp
@@ -15,3 +15,15 @@
 
 struct S { } s;
 void i(int = s) { } // expected-error {{incompatible type}}
+
+struct X { 
+  X(int);
+};
+
+void j(X x = 17);
+
+struct Y {
+  explicit Y(int);
+};
+
+void k(Y y = 17); // expected-error{{incompatible type in default argument}}