summaryrefslogtreecommitdiffstats
path: root/lib/Sema/SemaCast.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-11-29 22:48:16 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-11-29 22:48:16 +0000
commitc8d7f586180995ba33d03c0f6115b6a7bdefe326 (patch)
treef4f1aee0e983e537d623109a3baa0ce128c30ae5 /lib/Sema/SemaCast.cpp
parent381711c6e7911d762f81a65e9ef4339a6a3d6524 (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145447 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaCast.cpp')
-rw-r--r--lib/Sema/SemaCast.cpp78
1 files changed, 11 insertions, 67 deletions
diff --git a/lib/Sema/SemaCast.cpp b/lib/Sema/SemaCast.cpp
index 586d3cbae6..0250b3e380 100644
--- a/lib/Sema/SemaCast.cpp
+++ b/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));
}
-