[cfe-commits] r145244 - in /cfe/trunk: include/clang/AST/ExprCXX.h include/clang/Sema/Initialization.h include/clang/Sema/Sema.h lib/Sema/Sema.cpp lib/Sema/SemaCast.cpp lib/Sema/SemaExprCXX.cpp lib/Sema/SemaInit.cpp test/Index/preamble_macro_template.cpp test/Index/recursive-cxx-member-calls.cpp

Richard Smith richard at metafoo.co.uk
Tue Nov 29 15:06:32 PST 2011


On Tue, November 29, 2011 22:28, Richard Smith wrote:
> This change produces a broken AST for this testcase:
>
> _Complex double d = 0.0;
> int n = static_cast<int>(d);
>
> Please fix or revert. Thanks!
> Richard

This patch is also causing us to build broken ASTs when compiling Chromium,
for what appears to be an unrelated reason. I've reverted the patch in
r145447.

I'm also concerned that the approach makes it rather easy to accidentally
introduce this sort of issue. Have you considered passing a pointer to a
structure containing all the relevant information for building the cast
expression through the relevant code, rather than just a
CheckedConversionKind?

Thanks,
Richard

> On Mon, November 28, 2011 12:21, Nicola Gigante wrote:
>
>> Author: gigabytes
>> Date: Mon Nov 28 06:21:57 2011
>> New Revision: 145244
>>
>>
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=145244&view=rev
>> Log:
>> Removed useless ImplicitCast nodes in explicit cstyle and static casts
>>
>>
>>
>> Modified:
>> cfe/trunk/include/clang/AST/ExprCXX.h
>> cfe/trunk/include/clang/Sema/Initialization.h
>> cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/Sema.cpp
>> cfe/trunk/lib/Sema/SemaCast.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> cfe/trunk/lib/Sema/SemaInit.cpp
>> cfe/trunk/test/Index/preamble_macro_template.cpp
>> cfe/trunk/test/Index/recursive-cxx-member-calls.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/ExprCXX.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?re
>> v =145244&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
>> +++ cfe/trunk/include/clang/AST/ExprCXX.h Mon Nov 28 06:21:57 2011
>> @@ -178,9 +178,11 @@
>> /// \brief Retrieve the location of the cast operator keyword, e.g.,
>> /// "static_cast".
>> SourceLocation getOperatorLoc() const { return Loc; }
>> +  void setOperatorLoc(SourceLocation const& OpLoc) { Loc = OpLoc; }
>>
>>
>>
>> /// \brief Retrieve the location of the closing parenthesis.
>> SourceLocation getRParenLoc() const { return RParenLoc; }
>> +  void setRParenLoc(SourceLocation const& Loc) { RParenLoc = Loc; }
>>
>>
>>
>> SourceRange getSourceRange() const {
>> return SourceRange(Loc, RParenLoc);
>>
>> Modified: cfe/trunk/include/clang/Sema/Initialization.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Initializat
>> i on.h?rev=145244&r1=145243&r2=145244&view=diff
>> ===========================================================================
>> ==
>> =
>> --- cfe/trunk/include/clang/Sema/Initialization.h (original)
>> +++ cfe/trunk/include/clang/Sema/Initialization.h Mon Nov 28 06:21:57 2011
>> @@ -340,7 +340,7 @@
>> SIK_Default = IK_Default, ///< Default initialization
>> SIK_Value = IK_Value,     ///< Value initialization
>> SIK_ImplicitValue,        ///< Implicit value initialization
>> -    SIK_DirectCast,  ///< Direct initialization due to a cast
>> +    SIK_DirectStaticCast,  ///< Direct initialization due to a static cast
>> /// \brief Direct initialization due to a C-style cast.
>> SIK_DirectCStyleCast,
>> /// \brief Direct initialization due to a functional-style cast.
>> @@ -372,8 +372,8 @@
>>
>>
>>
>> /// \brief Create a direct initialization due to a cast that isn't a
>> C-style
>> /// or functional cast.
>> -  static InitializationKind CreateCast(SourceRange TypeRange) {
>> -    return InitializationKind(SIK_DirectCast,
>> +  static InitializationKind CreateStaticCast(SourceRange TypeRange) {
>> +    return InitializationKind(SIK_DirectStaticCast,
>> TypeRange.getBegin(), TypeRange.getBegin(),
>> TypeRange.getEnd());
>> }
>> @@ -425,7 +425,7 @@
>>
>>
>>
>> /// \brief Determine whether this initialization is an explicit cast.
>> bool isExplicitCast() const { -    return Kind == SIK_DirectCast || +
>> return Kind == SIK_DirectStaticCast || Kind == SIK_DirectCStyleCast ||
>> Kind == SIK_DirectFunctionalCast;
>> }
>> @@ -440,6 +440,11 @@
>> return Kind == SIK_DirectCStyleCast; }
>>
>>
>> +  /// brief Determine whether this is a static cast.
>> +  bool isStaticCast() const {
>> +    return Kind == SIK_DirectStaticCast;
>> +  }
>> +
>> /// brief Determine whether this is a functional-style cast.
>> bool isFunctionalCast() const { return Kind == SIK_DirectFunctionalCast;
>>
>> Modified: cfe/trunk/include/clang/Sema/Sema.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=
>> 1
>> 45244&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/include/clang/Sema/Sema.h (original)
>> +++ cfe/trunk/include/clang/Sema/Sema.h Mon Nov 28 06:21:57 2011
>> @@ -5557,18 +5557,26 @@
>> CCK_CStyleCast,
>> /// \brief A functional-style cast.
>> CCK_FunctionalCast,
>> +    /// \breif A static cast
>> +    CCK_StaticCast,
>> /// \brief A cast other than a C-style cast.
>> CCK_OtherCast
>> };
>>
>>
>>
>> -  /// ImpCastExprToType - If Expr is not of type 'Type', insert an
>> implicit -  /// cast.  If there is already an implicit cast, merge into the
>> existing one. -  /// If isLvalue, the result of the cast is an lvalue. +  ///
>> CastExprToType - If Expr is not of type 'Type', insert a cast of the
>> +  /// specified kind.
>> +  /// Redundant implicit casts are merged together.
>> +  ExprResult CastExprToType(Expr *E, QualType Ty,
>> +                            CastKind Kind, ExprValueKind VK,
>> +                            const CXXCastPath *BasePath,
>> +                            CheckedConversionKind CCK);
>> +
>> +  /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
>>  cast. +  /// If there is already an implicit cast, merge into the existing
>>  one. +  /// The result is of the given category. ExprResult
>> ImpCastExprToType(Expr *E, QualType Type, CastKind CK,
>> ExprValueKind VK = VK_RValue,
>> -                               const CXXCastPath *BasePath = 0,
>> -                               CheckedConversionKind CCK
>> -                                  = CCK_ImplicitConversion);
>> +                               const CXXCastPath *BasePath = 0);
>>
>>
>>
>> /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
>> /// to the conversion from scalar type ScalarTy to the Boolean type.
>> @@ -5757,10 +5765,10 @@
>> AssignmentAction Action,
>> CheckedConversionKind CCK
>> = CCK_ImplicitConversion);
>> -  ExprResult PerformImplicitConversion(Expr *From, QualType ToType,
>> -                                       const StandardConversionSequence&
>> SCS,
>> -                                       AssignmentAction Action,
>> -                                       CheckedConversionKind CCK);
>> +  ExprResult PerformConversion(Expr *From, QualType ToType,
>> +                               const StandardConversionSequence& SCS,
>> +                               AssignmentAction Action,
>> +                               CheckedConversionKind CCK);
>>
>>
>>
>> /// the following "Check" methods will return a valid/converted QualType
>> /// or a null QualType (indicating an error diagnostic was issued).
>>
>>
>>
>> Modified: cfe/trunk/lib/Sema/Sema.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=145244&r
>> 1
>> =145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/lib/Sema/Sema.cpp (original)
>> +++ cfe/trunk/lib/Sema/Sema.cpp Mon Nov 28 06:21:57 2011
>> @@ -234,13 +234,16 @@
>> AnalysisWarnings.PrintStats();
>> }
>>
>>
>>
>> -/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
>> cast. -/// If there is already an implicit cast, merge into the existing
>> one. -/// The result is of the given category.
>> -ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
>> -                                   CastKind Kind, ExprValueKind VK,
>> -                                   const CXXCastPath *BasePath,
>> -                                   CheckedConversionKind CCK) {
>> +/// CastExprToType - If Expr is not of type 'Type', insert a cast of the
>> +/// specified kind.
>> +/// Redundant implicit casts are merged together.
>> +/// Pay attention: if CCK != CCK_ImplicitConversion,
>> +/// users of this function must fill
>> +/// SourceTypeInfos and SourceLocations later
>> +ExprResult Sema::CastExprToType(Expr *E, QualType Ty,
>> +                                CastKind Kind, ExprValueKind VK,
>> +                                const CXXCastPath *BasePath,
>> +                                CheckedConversionKind CCK) {
>> #ifndef NDEBUG
>> if (VK == VK_RValue && !E->isRValue()) { switch (Kind) { @@ -276,16 +279,41
>> @@
>> MarkVTableUsed(E->getLocStart(),
>> cast<CXXRecordDecl>(RecordTy->getDecl())); } -
>> -  if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
>> -    if (ImpCast->getCastKind() == Kind && (!BasePath || BasePath->empty()))
>> {
>> -      ImpCast->setType(Ty);
>> -      ImpCast->setValueKind(VK);
>> -      return Owned(E);
>> -    }
>> +
>> +  switch(CCK) {
>> +    default:
>> +      llvm_unreachable("Unexpected CheckedConversionKind");
>> +    case CCK_ImplicitConversion:
>> +      if (ImplicitCastExpr *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
>> +        if (ImpCast->getCastKind() == Kind && (!BasePath ||
>> BasePath->empty())) {
>> +          ImpCast->setType(Ty);
>> +          ImpCast->setValueKind(VK);
>> +          return Owned(E);
>> +        }
>> +      }
>> +      return Owned(ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath,
>>  VK));
>> +    case CCK_CStyleCast:
>> +      return Owned(CStyleCastExpr::Create(Context, Ty, VK, Kind, E,
>> BasePath,
>> +                                          0, SourceLocation(),
>> SourceLocation()));
>> +    case CCK_FunctionalCast:
>> +      return Owned(CXXFunctionalCastExpr::Create(Context, Ty, VK, 0,
>> +                                                 SourceLocation(), Kind, E,
>>  +                                                 BasePath,
>> SourceLocation()));
>> +    case CCK_StaticCast:
>> +      return Owned(CXXStaticCastExpr::Create(Context, Ty, VK, Kind, E,
>> BasePath,
>> +                                             0, SourceLocation(),
>> +                                             SourceLocation()));
>> }
>> +
>> +}
>>
>>
>>
>> -  return Owned(ImplicitCastExpr::Create(Context, Ty, Kind, E, BasePath,
>> VK));
>> +/// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit
>> cast. +/// If there is already an implicit cast, merge into the existing
>> one. +/// The result is of the given category.
>> +ExprResult Sema::ImpCastExprToType(Expr *E, QualType Ty,
>> +                                   CastKind Kind, ExprValueKind VK,
>> +                                   const CXXCastPath *BasePath) {
>> +  return CastExprToType(E, Ty, Kind, VK, BasePath, CCK_ImplicitConversion);
>>  }
>>
>>
>>
>> /// ScalarTypeToBooleanCastKind - Returns the cast kind corresponding
>>
>>
>>
>> Modified: cfe/trunk/lib/Sema/SemaCast.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCast.cpp?rev=1452
>> 4
>> 4&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/lib/Sema/SemaCast.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaCast.cpp Mon Nov 28 06:21:57 2011
>> @@ -75,9 +75,9 @@
>> // Top-level semantics-checking routines.
>> void CheckConstCast(); void CheckReinterpretCast(); -    void
> CheckStaticCast();
>
>> +    void CheckStaticCast(bool &CastNodesCreated);
>> void CheckDynamicCast(); -    void CheckCXXCStyleCast(bool FunctionalCast); +
>> void CheckCXXCStyleCast(bool FunctionalCast, bool &CastNodesCreated); void
>> CheckCStyleCast();
>>
>>
>> /// Complete an apparently-successful cast operation that yields
>> @@ -283,12 +283,28 @@
>> Parens.getEnd()));
>> }
>> case tok::kw_static_cast: { +    bool CastNodesCreated = false; if
>> (!TypeDependent) { -      Op.CheckStaticCast();
>> +      Op.CheckStaticCast(CastNodesCreated);
>> if (Op.SrcExpr.isInvalid()) return ExprError(); }
>>
>>
>> +    // CheckStaticCast _may_ have already created the cast node. Let's
>> check +    if (CastNodesCreated) {
>> +      if (CXXStaticCastExpr *Cast =
>> +          dyn_cast<CXXStaticCastExpr>(Op.SrcExpr.get())) {
>> +        assert(!Cast->getTypeInfoAsWritten() &&
>> +               "The explicit cast node created by CheckStaticCast "
>> +               "has source type infos!");
>> +
>> +        Cast->setTypeInfoAsWritten(DestTInfo);
>> +        Cast->setOperatorLoc(OpLoc);
>> +        Cast->setRParenLoc(Parens.getEnd());
>> +
>> +        return Op.complete(Cast);
>> +      }
>> +    }
>> return Op.complete(CXXStaticCastExpr::Create(Context, Op.ResultType,
>> Op.ValueKind, Op.Kind, Op.SrcExpr.take(),
>> &Op.BasePath, DestTInfo,
>> @@ -327,7 +343,7 @@
>> = (CT == CT_CStyle)? InitializationKind::CreateCStyleCast(range.getBegin(),
>> range) : (CT == CT_Functional)?
>> InitializationKind::CreateFunctionalCast(range)
>> -    : InitializationKind::CreateCast(/*type range?*/ range);
>> +    : InitializationKind::CreateStaticCast(/*type range?*/ range);
>> InitializationSequence sequence(S, entity, initKind, &src, 1);
>>
>>
>>
>> assert(sequence.Failed() && "initialization succeeded on second try?"); @@
>> -714,7 +730,7 @@
>> /// CheckStaticCast - Check that a static_cast\<DestType\>(SrcExpr) is
>> valid. /// Refer to C++ 5.2.9 for details. Static casts are mostly used for
>> making /// implicit conversions explicit and getting rid of data loss
>> warnings. -void CastOperation::CheckStaticCast() {
>> +void CastOperation::CheckStaticCast(bool &CastNodesCreated) {
>> if (isPlaceholder()) { checkNonOverloadPlaceholders(); if
>> (SrcExpr.isInvalid())
>> @@ -747,9 +763,10 @@
>> return; }
>>
>>
>> +  Expr *SrcExprOrig = SrcExpr.get();
>> unsigned msg = diag::err_bad_cxx_cast_generic; TryCastResult tcr -    =
>> TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_OtherCast, OpRange,
>> msg, +    = TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_StaticCast,
>> OpRange, msg,
>> Kind, BasePath);
>> if (tcr != TC_Success && msg != 0) { if (SrcExpr.isInvalid()) @@ -767,10
> +784,12
>
>> @@
>> if (Kind == CK_BitCast) checkCastAlign(); if
>> (Self.getLangOptions().ObjCAutoRefCount)
>> -      checkObjCARCConversion(Sema::CCK_OtherCast);
>> +      checkObjCARCConversion(Sema::CCK_StaticCast);
>> } else if (Kind == CK_BitCast) {
>> checkCastAlign(); } +
>> +  CastNodesCreated = (SrcExpr.get() != SrcExprOrig);
>> }
>>
>>
>>
>> /// TryStaticCast - Check if a static cast can be performed, and do so if
>> @@ -1308,7 +1327,7 @@
>> ? InitializationKind::CreateCStyleCast(OpRange.getBegin(), OpRange)
>> : (CCK == Sema::CCK_FunctionalCast)
>> ? InitializationKind::CreateFunctionalCast(OpRange)
>> -    : InitializationKind::CreateCast(OpRange);
>> +    : InitializationKind::CreateStaticCast(OpRange);
>> Expr *SrcExprRaw = SrcExpr.get();
>> InitializationSequence InitSeq(Self, Entity, InitKind, &SrcExprRaw, 1);
>>
>>
>>
>> @@ -1742,7 +1761,9 @@
>> return TC_Success; }
>>
>>
>> -void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle) {
>> +void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle,
>> +                                       bool &CastNodesCreated) {
>> +  CastNodesCreated = false;
>> // Handle placeholders.
>> if (isPlaceholder()) { // C-style casts can resolve __unknown_any types. @@
>> -1823,6 +1844,7 @@
>> = FunctionalStyle? Sema::CCK_FunctionalCast
>> : Sema::CCK_CStyleCast;
>> if (tcr == TC_NotApplicable) { +    Expr *SrcExprOrig = SrcExpr.get(); // ...
>> or if that is not possible, a static_cast, ignoring const, ... tcr =
>> TryStaticCast(Self, SrcExpr, DestType, CCK, OpRange, msg, Kind,
>> BasePath);
>> @@ -1836,6 +1858,8 @@
>> if (SrcExpr.isInvalid()) return; } +
>> +    CastNodesCreated = (SrcExpr.get() != SrcExprOrig);
>> }
>>
>>
>>
>> if (Self.getLangOptions().ObjCAutoRefCount && tcr == TC_Success) @@ -2053,8
>>  +2077,9 @@
>> Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange();
>> Op.OpRange = SourceRange(LPLoc, CastExpr->getLocEnd());
>>
>>
>>
>> +  bool CastNodesCreated = false;
>> if (getLangOptions().CPlusPlus) { -
>> Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ false);
>> +    Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ false, CastNodesCreated);
>> } else {
>> Op.CheckCStyleCast();
>> }
>> @@ -2062,6 +2087,20 @@
>> if (Op.SrcExpr.isInvalid()) return ExprError();
>>
>> +  // CheckCXXCStyleCast _may_ have already created the CStyleCastExpr
>> +  // node. Let's check.
>> +  if (CastNodesCreated) {
>> +    if (CStyleCastExpr *Cast = dyn_cast<CStyleCastExpr>(Op.SrcExpr.get())){
>>  +      assert(!Cast->getTypeInfoAsWritten() &&
>> +             "The explicit cast node created by CheckStaticCast "
>> +             "has source type infos!");
>> +      Cast->setTypeInfoAsWritten(CastTypeInfo);
>> +      Cast->setLParenLoc(LPLoc);
>> +      Cast->setRParenLoc(RPLoc);
>> +      return Op.complete(Cast);
>> +    }
>> +  }
>> +
>> return Op.complete(CStyleCastExpr::Create(Context, Op.ResultType,
>> Op.ValueKind,
>> Op.Kind, Op.SrcExpr.take(),
>> &Op.BasePath, CastTypeInfo, LPLoc, RPLoc));
>> @@ -2075,11 +2114,28 @@
>> Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange();
>> Op.OpRange = SourceRange(Op.DestRange.getBegin(), CastExpr->getLocEnd());
>>
>>
>>
>> -  Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ true);
>> +  bool CastNodesCreated = false;
>> +  Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ true, CastNodesCreated);
>> if (Op.SrcExpr.isInvalid()) return ExprError();
>>
>> +  // CheckCXXCStyleCast _may_ have already created the
>> CXXFunctionalCastExpr
>> +  // node. Let's check.
>> +  if (CastNodesCreated) {
>> +    if (CXXFunctionalCastExpr *Cast =
>> +        dyn_cast<CXXFunctionalCastExpr>(Op.SrcExpr.get())){
>> +      assert(!Cast->getTypeInfoAsWritten() &&
>> +             "The explicit cast node created by CheckStaticCast "
>> +             "has source type infos!");
>> +      Cast->setTypeInfoAsWritten(CastTypeInfo);
>> +      Cast->setTypeBeginLoc(Op.DestRange.getBegin());
>> +      Cast->setRParenLoc(RPLoc);
>> +      return Op.complete(Cast);
>> +    }
>> +  }
>> +
>> return Op.complete(CXXFunctionalCastExpr::Create(Context, Op.ResultType,
>> Op.ValueKind, CastTypeInfo, Op.DestRange.getBegin(),
>> Op.Kind, Op.SrcExpr.take(), &Op.BasePath, RPLoc));
>> }
>> +
>>
>>
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=1
>> 4
>> 5244&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Mon Nov 28 06:21:57 2011
>> @@ -2125,8 +2125,8 @@
>> CheckedConversionKind CCK) {
>> switch (ICS.getKind()) { case
>> ImplicitConversionSequence::StandardConversion: {
>> -    ExprResult Res = PerformImplicitConversion(From, ToType, ICS.Standard,
>> -                                               Action, CCK);
>> +    ExprResult Res = PerformConversion(From, ToType, ICS.Standard,
>> +                                       Action, CCK);
>> if (Res.isInvalid()) return ExprError(); From = Res.take(); @@ -2160,9
>> +2160,8 @@
>> // Watch out for elipsis conversion.
>> if (!ICS.UserDefined.EllipsisConversion) { ExprResult Res = -
>> PerformImplicitConversion(From, BeforeToType,
>> -                                    ICS.UserDefined.Before, AA_Converting,
>> -                                    CCK);
>> +          PerformConversion(From, BeforeToType,
>> +                            ICS.UserDefined.Before, AA_Converting, CCK);
>> if (Res.isInvalid()) return ExprError(); From = Res.take(); @@ -2182,8
>> +2181,8 @@
>>
>>
>>
>> From = CastArg.take();
>>
>>
>>
>> -      return PerformImplicitConversion(From, ToType,
>> ICS.UserDefined.After,
>> -                                       AA_Converting, CCK);
>> +      return PerformConversion(From, ToType, ICS.UserDefined.After,
>> +                               AA_Converting, CCK);
>> }
>>
>>
>>
>> case ImplicitConversionSequence::AmbiguousConversion: @@ -2203,13 +2202,13
>> @@
>> return Owned(From); }
>>
>>
>> -/// PerformImplicitConversion - Perform an implicit conversion of the
>> +/// PerformConversion - Perform a conversion of the
>> /// expression From to the type ToType by following the standard
>> /// conversion sequence SCS. Returns the converted
>> /// expression. Flavor is the context in which we're performing this
>> /// conversion, for use in error messages.
>> ExprResult
>> -Sema::PerformImplicitConversion(Expr *From, QualType ToType,
>> +Sema::PerformConversion(Expr *From, QualType ToType,
>> const StandardConversionSequence& SCS, AssignmentAction Action,
>> CheckedConversionKind CCK) {
>> @@ -2263,7 +2262,7 @@
>> FromType = From->getType();
>> }
>>
>>
>>
>> -  // Perform the first implicit conversion.
>> +  // Perform the first conversion step.
>> switch (SCS.First) { case ICK_Identity: // Nothing to do. @@ -2278,21
>> +2277,21 @@
>>
>>
>>
>> case ICK_Array_To_Pointer: FromType =
>> Context.getArrayDecayedType(FromType);
>> -    From = ImpCastExprToType(From, FromType, CK_ArrayToPointerDecay,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, FromType, CK_ArrayToPointerDecay,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Function_To_Pointer: FromType = Context.getPointerType(FromType); -
>> From = ImpCastExprToType(From, FromType, CK_FunctionToPointerDecay,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, FromType, CK_FunctionToPointerDecay,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> default:
>> llvm_unreachable("Improper first standard conversion"); }
>>
>>
>> -  // Perform the second implicit conversion
>> +  // Perform the second conversion step
>> switch (SCS.Second) { case ICK_Identity: // If both sides are functions (or
>> pointers/references to them), there could @@ -2308,20 +2307,20 @@ if
>> (CheckExceptionSpecCompatibility(From, ToType)) return ExprError();
>>
>>
>> -    From = ImpCastExprToType(From, ToType, CK_NoOp,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK_NoOp,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Integral_Promotion: case ICK_Integral_Conversion: -    From =
>> ImpCastExprToType(From, ToType, CK_IntegralCast,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK_IntegralCast,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Floating_Promotion: case ICK_Floating_Conversion: -    From =
>> ImpCastExprToType(From, ToType, CK_FloatingCast,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK_FloatingCast,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Complex_Promotion: @@ -2339,23 +2338,23 @@ } else {
>> CK = CK_IntegralComplexCast;
>> }
>> -    From = ImpCastExprToType(From, ToType, CK,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break; }
>>
>>
>> case ICK_Floating_Integral: if (ToType->isRealFloatingType()) -      From =
>>  ImpCastExprToType(From, ToType, CK_IntegralToFloating,
>> -                               VK_RValue, /*BasePath=*/0, CCK).take();
>> +      From = CastExprToType(From, ToType, CK_IntegralToFloating,
>> +                            VK_RValue, /*BasePath=*/0, CCK).take();
>> else -      From = ImpCastExprToType(From, ToType, CK_FloatingToIntegral, -
>> VK_RValue, /*BasePath=*/0, CCK).take();
>> +      From = CastExprToType(From, ToType, CK_FloatingToIntegral,
>> +                            VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Compatible_Conversion: -      From = ImpCastExprToType(From,
>> ToType,
>> CK_NoOp,
>> -                               VK_RValue, /*BasePath=*/0, CCK).take();
>> +      From = CastExprToType(From, ToType, CK_NoOp,
>> +                            VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Writeback_Conversion: @@ -2403,8 +2402,7 @@ From = E.take();
>> }
>>
>>
>>
>> -    From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath,
>> CCK)
>> -             .take();
>> +    From = CastExprToType(From, ToType, Kind, VK_RValue, &BasePath,
>> CCK).take();
>> break; }
>>
>>
>> @@ -2415,8 +2413,7 @@
>> return ExprError(); if (CheckExceptionSpecCompatibility(From, ToType))
>> return ExprError();
>> -    From = ImpCastExprToType(From, ToType, Kind, VK_RValue, &BasePath, CCK)
>>  -             .take();
>> +    From = CastExprToType(From, ToType, Kind, VK_RValue, &BasePath,
>> CCK).take();
>> break; }
>>
>>
>> @@ -2427,9 +2424,9 @@
>> FromType = Context.FloatTy;
>> }
>>
>>
>>
>> -    From = ImpCastExprToType(From, Context.BoolTy,
>> -                             ScalarTypeToBooleanCastKind(FromType),
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, Context.BoolTy,
>> +                          ScalarTypeToBooleanCastKind(FromType),
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Derived_To_Base: { @@ -2442,20 +2439,20 @@ CStyle))
>> return ExprError();
>>
>> -    From = ImpCastExprToType(From, ToType.getNonReferenceType(),
>> -                      CK_DerivedToBase, From->getValueKind(),
>> -                      &BasePath, CCK).take();
>> +    From = CastExprToType(From, ToType.getNonReferenceType(),
>> +                          CK_DerivedToBase, From->getValueKind(),
>> +                          &BasePath, CCK).take();
>> break; }
>>
>>
>> case ICK_Vector_Conversion: -    From = ImpCastExprToType(From, ToType,
>> CK_BitCast,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK_BitCast,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Vector_Splat: -    From = ImpCastExprToType(From, ToType,
>> CK_VectorSplat,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType, CK_VectorSplat,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break;
>>
>> case ICK_Complex_Real: @@ -2468,17 +2465,22 @@ if
>> (Context.hasSameUnqualifiedType(ElType, From->getType())) { // do nothing
>> } else if (From->getType()->isRealFloatingType()) {
>> -        From = ImpCastExprToType(From, ElType,
>> -                isFloatingComplex ? CK_FloatingCast :
>> CK_FloatingToIntegral).take();
>> +        From = CastExprToType(From, ElType,
>> +                              isFloatingComplex ? CK_FloatingCast
>> +                                                : CK_FloatingToIntegral,
>> +                              VK_RValue, /*BasePath=*/0, CCK).take();
>> } else {
>> assert(From->getType()->isIntegerType()); -        From =
>> ImpCastExprToType(From, ElType,
>> -                isFloatingComplex ? CK_IntegralToFloating :
>> CK_IntegralCast).take();
>> +        From = CastExprToType(From, ElType,
>> +                              isFloatingComplex ? CK_IntegralToFloating
>> +                                                : CK_IntegralCast,
>> +                              VK_RValue, /*BasePath=*/0, CCK).take();
>> }
>> // y -> _Complex y
>> -      From = ImpCastExprToType(From, ToType,
>> -                   isFloatingComplex ? CK_FloatingRealToComplex
>> -                                     : CK_IntegralRealToComplex).take();
>> +      From = CastExprToType(From, ToType,
>> +                            isFloatingComplex ? CK_FloatingRealToComplex
>> +                                              : CK_IntegralRealToComplex,
>> +                            VK_RValue, /*BasePath=*/ 0, CCK).take();
>>
>>
>>
>> // Case 2.  _Complex x -> y
>> } else {
>> @@ -2489,30 +2491,32 @@
>> bool isFloatingComplex = ElType->isRealFloatingType();
>>
>> // _Complex x -> x
>> -      From = ImpCastExprToType(From, ElType,
>> -                   isFloatingComplex ? CK_FloatingComplexToReal
>> -                                     : CK_IntegralComplexToReal,
>> -                               VK_RValue, /*BasePath=*/0, CCK).take();
>> +      From = CastExprToType(From, ElType,
>> +                            isFloatingComplex ? CK_FloatingComplexToReal
>> +                                              : CK_IntegralComplexToReal,
>> +                            VK_RValue, /*BasePath=*/0, CCK).take();
>>
>>
>>
>> // x -> y
>> if (Context.hasSameUnqualifiedType(ElType, ToType)) { // do nothing } else if
>> (ToType->isRealFloatingType()) {
>> -        From = ImpCastExprToType(From, ToType,
>> -                   isFloatingComplex ? CK_FloatingCast :
>> CK_IntegralToFloating,
>> -                                 VK_RValue, /*BasePath=*/0, CCK).take();
>> +        From = CastExprToType(From, ToType,
>> +                              isFloatingComplex ? CK_FloatingCast
>> +                                                : CK_IntegralToFloating,
>> +                              VK_RValue, /*BasePath=*/0, CCK).take();
>> } else {
>> assert(ToType->isIntegerType()); -        From = ImpCastExprToType(From,
>> ToType,
>> -                   isFloatingComplex ? CK_FloatingToIntegral :
>> CK_IntegralCast,
>> -                                 VK_RValue, /*BasePath=*/0, CCK).take();
>> +        From = CastExprToType(From, ToType,
>> +                              isFloatingComplex ? CK_FloatingToIntegral
>> +                                                : CK_IntegralCast,
>> +                              VK_RValue, /*BasePath=*/0, CCK).take();
>> }
>> }
>> break;
>>
>> case ICK_Block_Pointer_Conversion: { -    From = ImpCastExprToType(From,
>> ToType.getUnqualifiedType(), CK_BitCast,
>> -                             VK_RValue, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast,
>> +                          VK_RValue, /*BasePath=*/0, CCK).take();
>> break; }
>>
>>
>> @@ -2547,8 +2551,8 @@
>> // target type isn't a reference.
>> ExprValueKind VK = ToType->isReferenceType() ?
>> From->getValueKind() : VK_RValue;
>> -    From = ImpCastExprToType(From, ToType.getNonLValueExprType(Context),
>> -                             CK_NoOp, VK, /*BasePath=*/0, CCK).take();
>> +    From = CastExprToType(From, ToType.getNonLValueExprType(Context),
>> +                          CK_NoOp, VK, /*BasePath=*/0, CCK).take();
>>
>>
>>
>> if (SCS.DeprecatedStringLiteralToCharPtr &&
>> !getLangOptions().WritableStrings)
>>
>>
>>
>> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=1452
>> 4
>> 4&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaInit.cpp Mon Nov 28 06:21:57 2011
>> @@ -4863,7 +4863,7 @@
>> Sema::CheckedConversionKind CCK
>> = Kind.isCStyleCast()? Sema::CCK_CStyleCast
>> : Kind.isFunctionalCast()? Sema::CCK_FunctionalCast
>> -        : Kind.isExplicitCast()? Sema::CCK_OtherCast
>> +        : Kind.isStaticCast()? Sema::CCK_StaticCast
>> : Sema::CCK_ImplicitConversion;
>> ExprResult CurInitExprRes =
>> S.PerformImplicitConversion(CurInit.get(), Step->Type, *Step->ICS,
>>
>>
>>
>> Modified: cfe/trunk/test/Index/preamble_macro_template.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/preamble_macro_temp
>> l ate.cpp?rev=145244&r1=145243&r2=145244&view=diff
>> ===========================================================================
>> ==
>> =
>> --- cfe/trunk/test/Index/preamble_macro_template.cpp (original)
>> +++ cfe/trunk/test/Index/preamble_macro_template.cpp Mon Nov 28 06:21:57
>> 2011
>> @@ -9,7 +9,6 @@
>> // CHECK: preamble_macro_template.h:4:16: CompoundStmt= Extent=[4:16 - 6:2]
>> // CHECK: preamble_macro_template.h:5:3: CStyleCastExpr= Extent=[5:3 - 5:27]
>>  // CHECK: preamble_macro_template.h:1:21: CXXStaticCastExpr= Extent=[1:21
>> -
>> 5:27]
>> -// CHECK: preamble_macro_template.h:5:25: UnexposedExpr= Extent=[5:25 -
>> 5:26]
>> // CHECK: preamble_macro_template.h:5:25: IntegerLiteral= Extent=[5:25 -
>> 5:26]
>> // CHECK: preamble_macro_template.cpp:3:5: FunctionDecl=main:3:5
>> (Definition)
>> Extent=[3:1 - 3:15]
>> // CHECK: preamble_macro_template.cpp:3:12: CompoundStmt= Extent=[3:12 -
>> 3:15]
>>
>>
>>
>> Modified: cfe/trunk/test/Index/recursive-cxx-member-calls.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/recursive-cxx-membe
>> r -calls.cpp?rev=145244&r1=145243&r2=145244&view=diff
>> ============================================================================
>> ==
>> --- cfe/trunk/test/Index/recursive-cxx-member-calls.cpp (original)
>> +++ cfe/trunk/test/Index/recursive-cxx-member-calls.cpp Mon Nov 28 06:21:57
>> 2011
>> @@ -1632,7 +1632,6 @@
>> // CHECK: 41:30: UnaryOperator= Extent=[41:30 - 41:40]
>> // CHECK: 41:31: CXXFunctionalCastExpr= Extent=[41:31 - 41:40]
>> // CHECK: 41:31: TypeRef=size_t:2:25 Extent=[41:31 - 41:37]
>> -// CHECK: 41:38: UnexposedExpr= Extent=[41:38 - 41:39]
>> // CHECK: 41:38: IntegerLiteral= Extent=[41:38 - 41:39]
>> // CHECK: 42:1: CXXAccessSpecifier=:42:1 (Definition) Extent=[42:1 - 42:9]
>> // CHECK: 43:15: FieldDecl=Data:43:15 (Definition) Extent=[43:3 - 43:19]
>> @@ -1804,7 +1803,6 @@
>> // CHECK: 75:13: ParenExpr= Extent=[75:13 - 75:30]
>> // CHECK: 75:14: CStyleCastExpr= Extent=[75:14 - 75:29]
>> // CHECK: 75:25: UnexposedExpr= Extent=[75:25 - 75:29]
>> -// CHECK: 75:25: UnexposedExpr= Extent=[75:25 - 75:29]
>> // CHECK: 75:25: ArraySubscriptExpr= Extent=[75:25 - 75:29]
>> // CHECK: 75:25: DeclRefExpr=p:74:17 Extent=[75:25 - 75:26]
>> // CHECK: 75:27: IntegerLiteral= Extent=[75:27 - 75:28]
>> @@ -1813,7 +1811,6 @@
>> // CHECK: 75:34: ParenExpr= Extent=[75:34 - 75:51]
>> // CHECK: 75:35: CStyleCastExpr= Extent=[75:35 - 75:50]
>> // CHECK: 75:46: UnexposedExpr= Extent=[75:46 - 75:50]
>> -// CHECK: 75:46: UnexposedExpr= Extent=[75:46 - 75:50]
>> // CHECK: 75:46: ArraySubscriptExpr= Extent=[75:46 - 75:50]
>> // CHECK: 75:46: DeclRefExpr=p:74:17 Extent=[75:46 - 75:47]
>> // CHECK: 75:48: IntegerLiteral= Extent=[75:48 - 75:49]
>>
>>
>>
>>
>>
>>
>
>
>




More information about the cfe-commits mailing list