Now that we have copy initialization support, use it for checking the default arguments
llvm-svn: 58692
This commit is contained in:
parent
8e12c38115
commit
5496d4caa0
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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}}
|
||||
|
|
Loading…
Reference in New Issue