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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@81847 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2009-09-15 06:28:28 +00:00
Родитель 626c2d6bc8
Коммит f6c213a931
2 изменённых файлов: 21 добавлений и 10 удалений

Просмотреть файл

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

Просмотреть файл

@ -971,17 +971,34 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType,
return true; return true;
break; break;
case ImplicitConversionSequence::UserDefinedConversion: case ImplicitConversionSequence::UserDefinedConversion: {
{
FunctionDecl *FD = ICS.UserDefined.ConversionFunction; FunctionDecl *FD = ICS.UserDefined.ConversionFunction;
CastExpr::CastKind CastKind = CastExpr::CK_Unknown; CastExpr::CastKind CastKind = CastExpr::CK_Unknown;
if (isa<CXXConversionDecl>(FD)) QualType BeforeToType;
if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(FD)) {
CastKind = CastExpr::CK_UserDefinedConversion; 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; 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 else
assert(0 && "Unknown conversion function kind!"); assert(0 && "Unknown conversion function kind!");
if (PerformImplicitConversion(From, BeforeToType,
ICS.UserDefined.Before, "converting"))
return true;
OwningExprResult CastArg OwningExprResult CastArg
= BuildCXXCastArgument(From->getLocStart(), = BuildCXXCastArgument(From->getLocStart(),
ToType.getNonReferenceType(), ToType.getNonReferenceType(),