diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 14 | ||||
-rw-r--r-- | 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 bd3da49030e..33fc52b71dc 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 fe019c847a7..3acf119265c 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}} |