]> granicus.if.org Git - clang/commitdiff
Now that we have copy initialization support, use it for checking the default arguments
authorDouglas Gregor <dgregor@apple.com>
Tue, 4 Nov 2008 13:57:51 +0000 (13:57 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 4 Nov 2008 13:57:51 +0000 (13:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58692 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/SemaCXX/default1.cpp

index bd3da49030e63052d04a48a9c8cf583087bd7ad0..33fc52b71dca6374586a430373dbb9b15832ebfc 100644 (file)
@@ -126,22 +126,14 @@ Sema::ActOnParamDefaultArgument(DeclTy *param, SourceLocation EqualLoc,
   //   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;
   }
 
index fe019c847a70e345a17e2025a68aa9b801c60d14..3acf119265c4aca2006306ea4a08752285bd21f3 100644 (file)
@@ -15,3 +15,15 @@ void h(int i, int j = 2, int k = 3,
 
 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}}