From: John McCall Date: Wed, 3 Feb 2010 00:55:45 +0000 (+0000) Subject: Remove abstract expression kinds from the StmtClass enum. Update a few users X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=09cc141c89a5e9f305c17d7a88298647df16cedd;p=clang Remove abstract expression kinds from the StmtClass enum. Update a few users appropriately. Call out a few missing cases in the expression mangler. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95176 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 7f3c5cde38..f192b6f156 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -1748,7 +1748,7 @@ public: static bool classof(const Stmt *T) { StmtClass SC = T->getStmtClass(); - if (SC >= ExplicitCastExprClass && SC <= CStyleCastExprClass) + if (SC >= CStyleCastExprClass && SC <= CStyleCastExprClass) return true; if (SC >= CXXNamedCastExprClass && SC <= CXXFunctionalCastExprClass) return true; diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index d2001d9771..94caa6faad 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -102,6 +102,7 @@ public: #define LAST_STMT(CLASS) lastStmtConstant = CLASS##Class, #define FIRST_EXPR(CLASS) firstExprConstant = CLASS##Class, #define LAST_EXPR(CLASS) lastExprConstant = CLASS##Class +#define ABSTRACT_EXPR(CLASS, PARENT) #include "clang/AST/StmtNodes.def" }; private: diff --git a/include/clang/AST/StmtNodes.def b/include/clang/AST/StmtNodes.def index 301d6baf54..ec6149e55f 100644 --- a/include/clang/AST/StmtNodes.def +++ b/include/clang/AST/StmtNodes.def @@ -68,8 +68,7 @@ STMT(CXXTryStmt , Stmt) LAST_STMT(CXXTryStmt) // Expressions. -ABSTRACT_EXPR(Expr , Stmt) -FIRST_EXPR(Expr) +ABSTRACT_EXPR(Expr , Stmt) EXPR(PredefinedExpr , Expr) EXPR(DeclRefExpr , Expr) EXPR(IntegerLiteral , Expr) @@ -83,12 +82,12 @@ EXPR(SizeOfAlignOfExpr , Expr) EXPR(ArraySubscriptExpr , Expr) EXPR(CallExpr , Expr) EXPR(MemberExpr , Expr) -EXPR(CastExpr , Expr) +ABSTRACT_EXPR(CastExpr , Expr) EXPR(BinaryOperator , Expr) EXPR(CompoundAssignOperator, BinaryOperator) EXPR(ConditionalOperator , Expr) EXPR(ImplicitCastExpr , CastExpr) -EXPR(ExplicitCastExpr , CastExpr) +ABSTRACT_EXPR(ExplicitCastExpr, CastExpr) EXPR(CStyleCastExpr , ExplicitCastExpr) EXPR(CompoundLiteralExpr , Expr) EXPR(ExtVectorElementExpr , Expr) @@ -153,6 +152,7 @@ EXPR(ShuffleVectorExpr , Expr) EXPR(BlockExpr , Expr) EXPR(BlockDeclRefExpr , Expr) +FIRST_EXPR(PredefinedExpr) LAST_EXPR(BlockDeclRefExpr) #undef ABSTRACT_EXPR diff --git a/include/clang/AST/StmtVisitor.h b/include/clang/AST/StmtVisitor.h index 3a525507da..4986f08ac1 100644 --- a/include/clang/AST/StmtVisitor.h +++ b/include/clang/AST/StmtVisitor.h @@ -105,6 +105,7 @@ public: // Top switch stmt: dispatch to VisitFooStmt for each FooStmt. switch (S->getStmtClass()) { default: assert(0 && "Unknown stmt kind!"); +#define ABSTRACT_EXPR(CLASS, PARENT) #define STMT(CLASS, PARENT) \ case Stmt::CLASS ## Class: DISPATCH(CLASS, CLASS); #include "clang/AST/StmtNodes.def" diff --git a/include/clang/Checker/PathSensitive/CheckerVisitor.def b/include/clang/Checker/PathSensitive/CheckerVisitor.def index 7ec27efe51..2edc4a37b7 100644 --- a/include/clang/Checker/PathSensitive/CheckerVisitor.def +++ b/include/clang/Checker/PathSensitive/CheckerVisitor.def @@ -22,7 +22,6 @@ PREVISIT(ArraySubscriptExpr, Stmt) PREVISIT(BinaryOperator, Stmt) PREVISIT(CallExpr, Stmt) -PREVISIT(CastExpr, Stmt) PREVISIT(CXXOperatorCallExpr, CallExpr) PREVISIT(DeclStmt, Stmt) PREVISIT(ObjCMessageExpr, Stmt) diff --git a/include/clang/Checker/PathSensitive/CheckerVisitor.h b/include/clang/Checker/PathSensitive/CheckerVisitor.h index 913a6c75bc..72f0ae1375 100644 --- a/include/clang/Checker/PathSensitive/CheckerVisitor.h +++ b/include/clang/Checker/PathSensitive/CheckerVisitor.h @@ -42,7 +42,6 @@ public: return; case Stmt::ImplicitCastExprClass: - case Stmt::ExplicitCastExprClass: case Stmt::CStyleCastExprClass: static_cast(this)->PreVisitCastExpr(C, static_cast(S)); @@ -82,16 +81,18 @@ break; void PreVisitStmt(CheckerContext &C, const Stmt *S) {} void PostVisitStmt(CheckerContext &C, const Stmt *S) {} + + void PreVisitCastExpr(CheckerContext &C, const CastExpr *E) { + static_cast(this)->PreVisitStmt(C, E); + } #define PREVISIT(NAME, FALLBACK) \ void PreVisit ## NAME(CheckerContext &C, const NAME* S) {\ - PreVisit ## FALLBACK(C, S);\ + static_cast(this)->PreVisit ## FALLBACK(C, S);\ } -#include "clang/Checker/PathSensitive/CheckerVisitor.def" - #define POSTVISIT(NAME, FALLBACK) \ void PostVisit ## NAME(CheckerContext &C, const NAME* S) {\ - PostVisit ## FALLBACK(C, S);\ + static_cast(this)->PostVisit ## FALLBACK(C, S);\ } #include "clang/Checker/PathSensitive/CheckerVisitor.def" }; diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index cf78c66a8d..50ddc9156a 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1616,7 +1616,6 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { case Expr::BlockExprClass: case Expr::BlockDeclRefExprClass: case Expr::NoStmtClass: - case Expr::ExprClass: return ICEDiag(2, E->getLocStart()); case Expr::GNUNullExprClass: @@ -1812,9 +1811,7 @@ static ICEDiag CheckICE(const Expr* E, ASTContext &Ctx) { } } } - case Expr::CastExprClass: case Expr::ImplicitCastExprClass: - case Expr::ExplicitCastExprClass: case Expr::CStyleCastExprClass: case Expr::CXXFunctionalCastExprClass: case Expr::CXXNamedCastExprClass: diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp index ce97387ee3..a0830997dc 100644 --- a/lib/AST/Stmt.cpp +++ b/lib/AST/Stmt.cpp @@ -35,6 +35,7 @@ static StmtClassNameTable &getStmtInfoTableEntry(Stmt::StmtClass E) { // Intialize the table on the first use. Initialized = true; +#define ABSTRACT_EXPR(CLASS, PARENT) #define STMT(CLASS, PARENT) \ StmtClassInfo[(unsigned)Stmt::CLASS##Class].Name = #CLASS; \ StmtClassInfo[(unsigned)Stmt::CLASS##Class].Size = sizeof(CLASS); diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 93b9a8fbc7..4f84edd908 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -1056,21 +1056,38 @@ void CXXNameMangler::mangleIntegerLiteral(QualType T, void CXXNameMangler::mangleExpression(const Expr *E) { // ::= - // ::= - // ::= - // ::= cl * E # call + // ::= + // ::= + // ::= cl * E # call // ::= cv expression # conversion with one argument // ::= cv _ * E # conversion with a different number of arguments - // ::= st # sizeof (a type) + // ::= st # sizeof (a type) // ::= at # alignof (a type) // ::= // ::= // ::= sr # dependent name // ::= sr # dependent template-id // ::= sZ # size of a parameter pack - // ::= + // ::= switch (E->getStmtClass()) { - default: assert(false && "Unhandled expression kind!"); + default: + llvm_unreachable("unexpected statement kind"); + break; + + case Expr::CallExprClass: + // FIXME: implement + llvm_unreachable("mangling not implemented for calls"); + break; + + case Expr::CXXConstructExprClass: + // FIXME: implement + llvm_unreachable("mangling not implemented for construct exprs"); + break; + + case Expr::SizeOfAlignOfExprClass: + // FIXME: implement + llvm_unreachable("mangling not implemented for sizeof/alignof"); + break; case Expr::UnaryOperatorClass: { const UnaryOperator *UO = cast(E); diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index b23a69860b..1938e3dfb5 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -1684,6 +1684,7 @@ Sema::OwningStmtResult TreeTransform::TransformStmt(Stmt *S) { // Transform expressions by calling TransformExpr. #define STMT(Node, Parent) +#define ABSTRACT_EXPR(Node, Parent) #define EXPR(Node, Parent) case Stmt::Node##Class: #include "clang/AST/StmtNodes.def" { @@ -1707,6 +1708,7 @@ Sema::OwningExprResult TreeTransform::TransformExpr(Expr *E) { switch (E->getStmtClass()) { case Stmt::NoStmtClass: break; #define STMT(Node, Parent) case Stmt::Node##Class: break; +#define ABSTRACT_EXPR(Node, Parent) #define EXPR(Node, Parent) \ case Stmt::Node##Class: return getDerived().Transform##Node(cast(E)); #include "clang/AST/StmtNodes.def" @@ -3827,13 +3829,6 @@ TreeTransform::TransformMemberExpr(MemberExpr *E) { FirstQualifierInScope); } -template -Sema::OwningExprResult -TreeTransform::TransformCastExpr(CastExpr *E) { - assert(false && "Cannot transform abstract class"); - return SemaRef.Owned(E->Retain()); -} - template Sema::OwningExprResult TreeTransform::TransformBinaryOperator(BinaryOperator *E) { @@ -3897,13 +3892,6 @@ TreeTransform::TransformImplicitCastExpr(ImplicitCastExpr *E) { return getDerived().TransformExpr(E->getSubExprAsWritten()); } -template -Sema::OwningExprResult -TreeTransform::TransformExplicitCastExpr(ExplicitCastExpr *E) { - assert(false && "Cannot transform abstract class"); - return SemaRef.Owned(E->Retain()); -} - template Sema::OwningExprResult TreeTransform::TransformCStyleCastExpr(CStyleCastExpr *E) { diff --git a/tools/CIndex/CXCursor.cpp b/tools/CIndex/CXCursor.cpp index 03b050db31..ec1477eb8a 100644 --- a/tools/CIndex/CXCursor.cpp +++ b/tools/CIndex/CXCursor.cpp @@ -115,7 +115,6 @@ CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, ASTUnit *TU) { K = CXCursor_UnexposedStmt; break; - case Stmt::ExprClass: case Stmt::PredefinedExprClass: case Stmt::IntegerLiteralClass: case Stmt::FloatingLiteralClass: @@ -126,12 +125,10 @@ CXCursor cxcursor::MakeCXCursor(Stmt *S, Decl *Parent, ASTUnit *TU) { case Stmt::UnaryOperatorClass: case Stmt::SizeOfAlignOfExprClass: case Stmt::ArraySubscriptExprClass: - case Stmt::CastExprClass: case Stmt::BinaryOperatorClass: case Stmt::CompoundAssignOperatorClass: case Stmt::ConditionalOperatorClass: case Stmt::ImplicitCastExprClass: - case Stmt::ExplicitCastExprClass: case Stmt::CStyleCastExprClass: case Stmt::CompoundLiteralExprClass: case Stmt::ExtVectorElementExprClass: