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) {
diff --git a/lib/Analysis/Environment.cpp b/lib/Analysis/Environment.cpp
index dd5caef..7f6fbd3 100644
--- a/lib/Analysis/Environment.cpp
+++ b/lib/Analysis/Environment.cpp
@@ -47,19 +47,8 @@
         // are no-ops.  We blast through these to get the descendant
         // subexpression that has a value.
         
-      case Stmt::ImplicitCastExprClass: {
-        ImplicitCastExpr* C = cast<ImplicitCastExpr>(E);
-        QualType CT = C->getType();
-        
-        if (CT->isVoidType())
-          return UnknownVal();
-        
-        QualType ST = C->getSubExpr()->getType();
-        
-        break;
-      }
-        
-      case Stmt::CastExprClass: {
+      case Stmt::ImplicitCastExprClass:
+      case Stmt::ExplicitCastExprClass: {
         CastExpr* C = cast<CastExpr>(E);
         QualType CT = C->getType();
         QualType ST = C->getSubExpr()->getType();
diff --git a/lib/Analysis/GRExprEngine.cpp b/lib/Analysis/GRExprEngine.cpp
index 896f473..18c5a58 100644
--- a/lib/Analysis/GRExprEngine.cpp
+++ b/lib/Analysis/GRExprEngine.cpp
@@ -356,12 +356,6 @@
       break;      
     }
       
-    case Stmt::CastExprClass: {
-      CastExpr* C = cast<CastExpr>(S);
-      VisitCast(C, C->getSubExpr(), Pred, Dst);
-      break;
-    }
-      
       // FIXME: ChooseExpr is really a constant.  We need to fix
       //        the CFG do not model them as explicit control-flow.
       
@@ -389,8 +383,9 @@
       VisitDeclStmt(cast<DeclStmt>(S), Pred, Dst);
       break;
       
-    case Stmt::ImplicitCastExprClass: {
-      ImplicitCastExpr* C = cast<ImplicitCastExpr>(S);
+    case Stmt::ImplicitCastExprClass:
+    case Stmt::ExplicitCastExprClass: {
+      CastExpr* C = cast<CastExpr>(S);
       VisitCast(C, C->getSubExpr(), Pred, Dst);
       break;
     }
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index ea60cbb..fe9b5c9 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -72,7 +72,7 @@
     return Visit(E->getInitializer());
   }
   
-  llvm::Constant *VisitCastExpr(const CastExpr* E) {
+  llvm::Constant *VisitCastExpr(CastExpr* E) {
     llvm::Constant *C = Visit(E->getSubExpr());
     
     return EmitConversion(C, E->getSubExpr()->getType(), E->getType());    
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index a8782c1..e5e80db 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -783,16 +783,10 @@
     
   // For casts, we need to handle conversions from arrays to
   // pointer values, and pointer-to-pointer conversions.
-  case Stmt::CastExprClass:
+  case Stmt::ExplicitCastExprClass:
   case Stmt::ImplicitCastExprClass: {
     
-    Expr* SubExpr;
-    
-    if (ImplicitCastExpr *IE = dyn_cast<ImplicitCastExpr>(E))
-      SubExpr = IE->getSubExpr();
-    else
-      SubExpr = cast<CastExpr>(E)->getSubExpr();
-    
+    Expr* SubExpr = cast<CastExpr>(E)->getSubExpr();
     QualType T = SubExpr->getType();
     
     if (T->isPointerType() || T->isObjCQualifiedIdType())
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 906255e..5a1ad50 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -946,7 +946,7 @@
          diag::err_init_element_not_constant, Init->getSourceRange());
     return true;
   }
-  case Expr::CastExprClass: {
+  case Expr::ExplicitCastExprClass: {
     const Expr* SubExpr = cast<CastExpr>(Init)->getSubExpr();
 
     // Check for pointer->pointer cast
@@ -1058,7 +1058,7 @@
     // if we don't, we'll figure it out later
     return 0;
   }
-  case Expr::CastExprClass: {
+  case Expr::ExplicitCastExprClass: {
     const Expr* SubExpr = cast<CastExpr>(E)->getSubExpr();
 
     // Check for pointer->pointer cast
@@ -1183,14 +1183,8 @@
     return true;
   }
   case Expr::ImplicitCastExprClass:
-  case Expr::CastExprClass: {
-    const Expr *SubExpr;
-    if (const CastExpr *C = dyn_cast<CastExpr>(Init)) {
-      SubExpr = C->getSubExpr();
-    } else {
-      SubExpr = cast<ImplicitCastExpr>(Init)->getSubExpr();
-    }
-
+  case Expr::ExplicitCastExprClass: {
+    const Expr *SubExpr = cast<CastExpr>(Init)->getSubExpr();
     if (SubExpr->getType()->isArithmeticType())
       return CheckArithmeticConstantExpression(SubExpr);
 
@@ -1267,9 +1261,7 @@
       }
     } else if (InitTy->isIntegralType()) {
       Expr* SubE = 0;
-      if (ImplicitCastExpr* ICE = dyn_cast<ImplicitCastExpr>(Init))
-        SubE = ICE->getSubExpr();
-      else if (CastExpr* CE = dyn_cast<CastExpr>(Init))
+      if (CastExpr* CE = dyn_cast<CastExpr>(Init))
         SubE = CE->getSubExpr();
       // Special check for pointer cast to int; we allow as an extension
       // an address constant cast to an integer if the integer
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index bb18a4a..cac103a 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1154,7 +1154,7 @@
 
   if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), castType, castExpr))
     return true;
-  return new CastExpr(castType, castExpr, LParenLoc);
+  return new ExplicitCastExpr(castType, castExpr, LParenLoc);
 }
 
 /// Note that lex is not null here, even if this is the gnu "x ?: y" extension.