зеркало из 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;
|
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(),
|
||||||
|
|
Загрузка…
Ссылка в новой задаче