diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-11-29 22:48:16 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2011-11-29 22:48:16 +0000 |
commit | 507840dbff1c83e2f80066f6d0bbdf66ad6ecfa2 (patch) | |
tree | 6a1bcf7e299801fababe4cd1091ec6a2542c2d78 /clang/lib/Sema/SemaCast.cpp | |
parent | 8b9ccfe270be7f94cc57b5de1a73d676f41df13a (diff) | |
download | bcm5719-llvm-507840dbff1c83e2f80066f6d0bbdf66ad6ecfa2.tar.gz bcm5719-llvm-507840dbff1c83e2f80066f6d0bbdf66ad6ecfa2.zip |
Revert r145244. It causes us to create broken ASTs with missing type information
for some cast expressions.
Original commit message:
Removed useless ImplicitCast nodes in explicit cstyle and static casts
llvm-svn: 145447
Diffstat (limited to 'clang/lib/Sema/SemaCast.cpp')
-rw-r--r-- | clang/lib/Sema/SemaCast.cpp | 78 |
1 files changed, 11 insertions, 67 deletions
diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp index 586d3cbae66..0250b3e3800 100644 --- a/clang/lib/Sema/SemaCast.cpp +++ b/clang/lib/Sema/SemaCast.cpp @@ -75,9 +75,9 @@ namespace { // Top-level semantics-checking routines. void CheckConstCast(); void CheckReinterpretCast(); - void CheckStaticCast(bool &CastNodesCreated); + void CheckStaticCast(); void CheckDynamicCast(); - void CheckCXXCStyleCast(bool FunctionalCast, bool &CastNodesCreated); + void CheckCXXCStyleCast(bool FunctionalCast); void CheckCStyleCast(); /// Complete an apparently-successful cast operation that yields @@ -283,28 +283,12 @@ Sema::BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, Parens.getEnd())); } case tok::kw_static_cast: { - bool CastNodesCreated = false; if (!TypeDependent) { - Op.CheckStaticCast(CastNodesCreated); + Op.CheckStaticCast(); 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, @@ -343,7 +327,7 @@ static bool tryDiagnoseOverloadedCast(Sema &S, CastType CT, = (CT == CT_CStyle)? InitializationKind::CreateCStyleCast(range.getBegin(), range) : (CT == CT_Functional)? InitializationKind::CreateFunctionalCast(range) - : InitializationKind::CreateStaticCast(/*type range?*/ range); + : InitializationKind::CreateCast(/*type range?*/ range); InitializationSequence sequence(S, entity, initKind, &src, 1); assert(sequence.Failed() && "initialization succeeded on second try?"); @@ -730,7 +714,7 @@ void CastOperation::CheckReinterpretCast() { /// 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(bool &CastNodesCreated) { +void CastOperation::CheckStaticCast() { if (isPlaceholder()) { checkNonOverloadPlaceholders(); if (SrcExpr.isInvalid()) @@ -763,10 +747,9 @@ void CastOperation::CheckStaticCast(bool &CastNodesCreated) { return; } - Expr *SrcExprOrig = SrcExpr.get(); unsigned msg = diag::err_bad_cxx_cast_generic; TryCastResult tcr - = TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_StaticCast, OpRange, msg, + = TryStaticCast(Self, SrcExpr, DestType, Sema::CCK_OtherCast, OpRange, msg, Kind, BasePath); if (tcr != TC_Success && msg != 0) { if (SrcExpr.isInvalid()) @@ -784,12 +767,10 @@ void CastOperation::CheckStaticCast(bool &CastNodesCreated) { if (Kind == CK_BitCast) checkCastAlign(); if (Self.getLangOptions().ObjCAutoRefCount) - checkObjCARCConversion(Sema::CCK_StaticCast); + checkObjCARCConversion(Sema::CCK_OtherCast); } else if (Kind == CK_BitCast) { checkCastAlign(); } - - CastNodesCreated = (SrcExpr.get() != SrcExprOrig); } /// TryStaticCast - Check if a static cast can be performed, and do so if @@ -1327,7 +1308,7 @@ TryStaticImplicitCast(Sema &Self, ExprResult &SrcExpr, QualType DestType, ? InitializationKind::CreateCStyleCast(OpRange.getBegin(), OpRange) : (CCK == Sema::CCK_FunctionalCast) ? InitializationKind::CreateFunctionalCast(OpRange) - : InitializationKind::CreateStaticCast(OpRange); + : InitializationKind::CreateCast(OpRange); Expr *SrcExprRaw = SrcExpr.get(); InitializationSequence InitSeq(Self, Entity, InitKind, &SrcExprRaw, 1); @@ -1761,9 +1742,7 @@ static TryCastResult TryReinterpretCast(Sema &Self, ExprResult &SrcExpr, return TC_Success; } -void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, - bool &CastNodesCreated) { - CastNodesCreated = false; +void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle) { // Handle placeholders. if (isPlaceholder()) { // C-style casts can resolve __unknown_any types. @@ -1844,7 +1823,6 @@ void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, = 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); @@ -1858,8 +1836,6 @@ void CastOperation::CheckCXXCStyleCast(bool FunctionalStyle, if (SrcExpr.isInvalid()) return; } - - CastNodesCreated = (SrcExpr.get() != SrcExprOrig); } if (Self.getLangOptions().ObjCAutoRefCount && tcr == TC_Success) @@ -2077,9 +2053,8 @@ ExprResult Sema::BuildCStyleCastExpr(SourceLocation LPLoc, Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange(); Op.OpRange = SourceRange(LPLoc, CastExpr->getLocEnd()); - bool CastNodesCreated = false; if (getLangOptions().CPlusPlus) { - Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ false, CastNodesCreated); + Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ false); } else { Op.CheckCStyleCast(); } @@ -2087,20 +2062,6 @@ ExprResult Sema::BuildCStyleCastExpr(SourceLocation LPLoc, 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)); @@ -2114,28 +2075,11 @@ ExprResult Sema::BuildCXXFunctionalCastExpr(TypeSourceInfo *CastTypeInfo, Op.DestRange = CastTypeInfo->getTypeLoc().getSourceRange(); Op.OpRange = SourceRange(Op.DestRange.getBegin(), CastExpr->getLocEnd()); - bool CastNodesCreated = false; - Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ true, CastNodesCreated); + Op.CheckCXXCStyleCast(/*FunctionalStyle=*/ true); 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)); } - |