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

llvm-svn: 58692
This commit is contained in:
Douglas Gregor 2008-11-04 13:57:51 +00:00
parent 8e12c38115
commit 5496d4caa0
2 changed files with 15 additions and 11 deletions

View 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;
}

View 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}}