diff options
Diffstat (limited to 'clang/lib/Sema')
| -rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 19 | 
1 files changed, 16 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 76c64f492b1..11279708585 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1113,9 +1113,22 @@ Sema::PerformImplicitConversion(Expr *&From, QualType ToType,    if (SCS.CopyConstructor) {      // FIXME: When can ToType be a reference type?      assert(!ToType->isReferenceType()); -    if (SCS.Second == ICK_Derived_To_Base) -      ImpCastExprToType(From, ToType, CastExpr::CK_DerivedToBase, -                        /*isLvalue=*/true); +    if (SCS.Second == ICK_Derived_To_Base) { +      ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(*this); +      if (CompleteConstructorCall(cast<CXXConstructorDecl>(SCS.CopyConstructor), +                                  MultiExprArg(*this, (void **)&From, 1), +                                  /*FIXME:ConstructLoc*/SourceLocation(),  +                                  ConstructorArgs)) +        return true; +      OwningExprResult FromResult = +        BuildCXXConstructExpr(/*FIXME:ConstructLoc*/SourceLocation(), +                              ToType, SCS.CopyConstructor, +                              move_arg(ConstructorArgs)); +      if (FromResult.isInvalid()) +        return true; +      From = FromResult.takeAs<Expr>(); +      return false; +    }      OwningExprResult FromResult =        BuildCXXConstructExpr(/*FIXME:ConstructLoc*/SourceLocation(),                              ToType, SCS.CopyConstructor,  | 

