When performing an user defined conversion sequence, perform the initial standard conversion sequence. This lets us remove a workaround in SemaCompleteConstructorCall.

llvm-svn: 81847
This commit is contained in:
Anders Carlsson 2009-09-15 06:28:28 +00:00
parent c5cb3bd927
commit 110b07b848
2 changed files with 21 additions and 10 deletions

View File

@ -3243,12 +3243,6 @@ Sema::CompleteConstructorCall(CXXConstructorDecl *Constructor,
Expr *Arg;
if (i < NumArgs) {
Arg = Args[i];
// Pass the argument.
if (PerformCopyInitialization(Arg, ProtoArgType, "passing"))
return true;
Args[i] = 0;
} else {
ParmVarDecl *Param = Constructor->getParamDecl(i);

View File

@ -971,17 +971,34 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType,
return true;
break;
case ImplicitConversionSequence::UserDefinedConversion:
{
case ImplicitConversionSequence::UserDefinedConversion: {
FunctionDecl *FD = ICS.UserDefined.ConversionFunction;
CastExpr::CastKind CastKind = CastExpr::CK_Unknown;
if (isa<CXXConversionDecl>(FD))
QualType BeforeToType;
if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(FD)) {
CastKind = CastExpr::CK_UserDefinedConversion;
else if (isa<CXXConstructorDecl>(FD))
// If the user-defined conversion is specified by a conversion function,
// the initial standard conversion sequence converts the source type to
// the implicit object parameter of the conversion function.
BeforeToType = Context.getTagDeclType(Conv->getParent());
} else if (const CXXConstructorDecl *Ctor =
dyn_cast<CXXConstructorDecl>(FD)) {
CastKind = CastExpr::CK_ConstructorConversion;
// If the user-defined conversion is specified by a constructor, the
// initial standard conversion sequence converts the source type to the
// type required by the argument of the constructor
BeforeToType = Ctor->getParamDecl(0)->getType();
}
else
assert(0 && "Unknown conversion function kind!");
if (PerformImplicitConversion(From, BeforeToType,
ICS.UserDefined.Before, "converting"))
return true;
OwningExprResult CastArg
= BuildCXXCastArgument(From->getLocStart(),
ToType.getNonReferenceType(),