зеркало из https://github.com/microsoft/clang-1.git
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:
Родитель
626c2d6bc8
Коммит
f6c213a931
|
@ -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);
|
||||
|
||||
|
|
|
@ -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(),
|
||||
|
|
Загрузка…
Ссылка в новой задаче