diff options
Diffstat (limited to 'clang/lib/Sema/SemaCXXCast.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaCXXCast.cpp | 37 | 
1 files changed, 17 insertions, 20 deletions
| diff --git a/clang/lib/Sema/SemaCXXCast.cpp b/clang/lib/Sema/SemaCXXCast.cpp index 014cec2b650..d3fe6aee5c9 100644 --- a/clang/lib/Sema/SemaCXXCast.cpp +++ b/clang/lib/Sema/SemaCXXCast.cpp @@ -913,27 +913,24 @@ TryStaticImplicitCast(Sema &Self, Expr *&SrcExpr, QualType DestType,      // At this point of CheckStaticCast, if the destination is a reference,      // this has to work. There is no other way that works.      // On the other hand, if we're checking a C-style cast, we've still got -    // the reinterpret_cast way. So in C-style mode, we first try the call -    // with an ICS to suppress errors. -    if (CStyle) { -      ImplicitConversionSequence ICS; -      if(Self.CheckReferenceInit(SrcExpr, DestType, OpRange.getBegin(), -                                 /*SuppressUserConversions=*/false, -                                 /*AllowExplicit=*/false, /*ForceRValue=*/false, -                                 &ICS)) -        return TC_NotApplicable; +    // the reinterpret_cast way. +    InitializedEntity Entity = InitializedEntity::InitializeTemporary(DestType); +    InitializationKind InitKind = InitializationKind::CreateCast(OpRange,  +                                                                 CStyle);     +    InitializationSequence InitSeq(Self, Entity, InitKind, &SrcExpr, 1); +    if (InitSeq.getKind() == InitializationSequence::FailedSequence && CStyle) +      return TC_NotApplicable; +     +    Sema::OwningExprResult Result +      = InitSeq.Perform(Self, Entity, InitKind, +                        Action::MultiExprArg(Self, (void**)&SrcExpr, 1)); +    if (Result.isInvalid()) { +      msg = 0; +      return TC_Failed;      } -    // Now we're committed either way. -    if(!Self.CheckReferenceInit(SrcExpr, DestType, OpRange.getBegin(), -                                /*SuppressUserConversions=*/false, -                                /*AllowExplicit=*/false, -                                /*ForceRValue=*/false, 0, -                                /*IgnoreBaseAccess=*/CStyle)) -      return TC_Success; - -    // We already got an error message. -    msg = 0; -    return TC_Failed; +     +    SrcExpr = Result.takeAs<Expr>(); +    return TC_Success;    }    if (DestType->isRecordType()) { | 

