From 5496d4caa086bf4960bde26ce57e6669dbfeb5b8 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 4 Nov 2008 13:57:51 +0000 Subject: [PATCH] Now that we have copy initialization support, use it for checking the default arguments llvm-svn: 58692 --- clang/lib/Sema/SemaDeclCXX.cpp | 14 +++----------- clang/test/SemaCXX/default1.cpp | 12 ++++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index bd3da49030e6..33fc52b71dca 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -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; } diff --git a/clang/test/SemaCXX/default1.cpp b/clang/test/SemaCXX/default1.cpp index fe019c847a70..3acf119265c4 100644 --- a/clang/test/SemaCXX/default1.cpp +++ b/clang/test/SemaCXX/default1.cpp @@ -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}}