Add ExplicitCastExpr to replace the current CastExpr, and have ImplicitCastExpr and ExplicitCastExpr derive from a common base class (CastExpr):
Expr
-> CastExpr
-> ExplicitCastExpr
-> ImplicitCastExpr
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54955 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp
index e78c359..a3efab6 100644
--- a/lib/AST/Expr.cpp
+++ b/lib/AST/Expr.cpp
@@ -359,7 +359,7 @@
return E->hasLocalSideEffect();
return false;
}
- case CastExprClass:
+ case ExplicitCastExprClass:
// If this is a cast to void, check the operand. Otherwise, the result of
// the cast is unused.
if (getType()->isVoidType())
@@ -534,8 +534,6 @@
E = P->getSubExpr();
else if (CastExpr *P = dyn_cast<CastExpr>(E))
E = P->getSubExpr();
- else if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E))
- E = P->getSubExpr();
else
return E;
}
@@ -645,16 +643,9 @@
return true;
}
case ImplicitCastExprClass:
- case CastExprClass: {
- const Expr *SubExpr;
- SourceLocation CastLoc;
- if (const CastExpr *C = dyn_cast<CastExpr>(this)) {
- SubExpr = C->getSubExpr();
- CastLoc = C->getLParenLoc();
- } else {
- SubExpr = cast<ImplicitCastExpr>(this)->getSubExpr();
- CastLoc = getLocStart();
- }
+ case ExplicitCastExprClass: {
+ const Expr *SubExpr = cast<CastExpr>(this)->getSubExpr();
+ SourceLocation CastLoc = getLocStart();
if (!SubExpr->isConstantExpr(Ctx, Loc)) {
if (Loc) *Loc = SubExpr->getLocStart();
return false;
@@ -940,16 +931,9 @@
break;
}
case ImplicitCastExprClass:
- case CastExprClass: {
- const Expr *SubExpr;
- SourceLocation CastLoc;
- if (const CastExpr *C = dyn_cast<CastExpr>(this)) {
- SubExpr = C->getSubExpr();
- CastLoc = C->getLParenLoc();
- } else {
- SubExpr = cast<ImplicitCastExpr>(this)->getSubExpr();
- CastLoc = getLocStart();
- }
+ case ExplicitCastExprClass: {
+ const Expr *SubExpr = cast<CastExpr>(this)->getSubExpr();
+ SourceLocation CastLoc = getLocStart();
// C99 6.6p6: shall only convert arithmetic types to integer types.
if (!SubExpr->getType()->isArithmeticType() ||
@@ -1043,7 +1027,7 @@
/// cast to void*.
bool Expr::isNullPointerConstant(ASTContext &Ctx) const {
// Strip off a cast to void*, if it exists.
- if (const CastExpr *CE = dyn_cast<CastExpr>(this)) {
+ if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
// Check that it is a cast to void*.
if (const PointerType *PT = CE->getType()->getAsPointerType()) {
QualType Pointee = PT->getPointeeType();
@@ -1326,10 +1310,6 @@
Stmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; }
Stmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; }
-// ImplicitCastExpr
-Stmt::child_iterator ImplicitCastExpr::child_begin() { return &Op; }
-Stmt::child_iterator ImplicitCastExpr::child_end() { return &Op+1; }
-
// CastExpr
Stmt::child_iterator CastExpr::child_begin() { return &Op; }
Stmt::child_iterator CastExpr::child_end() { return &Op+1; }
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 3fae5c9..8ba27f0 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -216,9 +216,6 @@
bool VisitUnaryOperator(const UnaryOperator *E);
bool VisitCastExpr(CastExpr* E) {
- return HandleCast(E->getLParenLoc(), E->getSubExpr(), E->getType());
- }
- bool VisitImplicitCastExpr(ImplicitCastExpr* E) {
return HandleCast(E->getLocStart(), E->getSubExpr(), E->getType());
}
bool VisitSizeOfAlignOfTypeExpr(const SizeOfAlignOfTypeExpr *E) {
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index abcab9c..5b4c0ec 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -689,7 +689,10 @@
OS << ".";
OS << Node->getAccessor().getName();
}
-void StmtPrinter::VisitCastExpr(CastExpr *Node) {
+void StmtPrinter::VisitCastExpr(CastExpr *) {
+ assert(0 && "CastExpr is an abstract class");
+}
+void StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *Node) {
OS << "(" << Node->getType().getAsString() << ")";
PrintExpr(Node->getSubExpr());
}
diff --git a/lib/AST/StmtSerialization.cpp b/lib/AST/StmtSerialization.cpp
index 99ca10d..9859846 100644
--- a/lib/AST/StmtSerialization.cpp
+++ b/lib/AST/StmtSerialization.cpp
@@ -57,9 +57,6 @@
case CaseStmtClass:
return CaseStmt::CreateImpl(D, C);
-
- case CastExprClass:
- return CastExpr::CreateImpl(D, C);
case CharacterLiteralClass:
return CharacterLiteral::CreateImpl(D, C);
@@ -108,6 +105,9 @@
case ImplicitCastExprClass:
return ImplicitCastExpr::CreateImpl(D, C);
+
+ case ExplicitCastExprClass:
+ return ExplicitCastExpr::CreateImpl(D, C);
case IndirectGotoStmtClass:
return IndirectGotoStmt::CreateImpl(D, C);
@@ -358,17 +358,17 @@
return stmt;
}
-void CastExpr::EmitImpl(Serializer& S) const {
+void ExplicitCastExpr::EmitImpl(Serializer& S) const {
S.Emit(getType());
S.Emit(Loc);
- S.EmitOwnedPtr(Op);
+ S.EmitOwnedPtr(getSubExpr());
}
-CastExpr* CastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
+ExplicitCastExpr* ExplicitCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {
QualType t = QualType::ReadVal(D);
SourceLocation Loc = SourceLocation::ReadVal(D);
Expr* Op = D.ReadOwnedPtr<Expr>(C);
- return new CastExpr(t,Op,Loc);
+ return new ExplicitCastExpr(t,Op,Loc);
}
@@ -631,7 +631,7 @@
void ImplicitCastExpr::EmitImpl(Serializer& S) const {
S.Emit(getType());
- S.EmitOwnedPtr(Op);
+ S.EmitOwnedPtr(getSubExpr());
}
ImplicitCastExpr* ImplicitCastExpr::CreateImpl(Deserializer& D, ASTContext& C) {