From: Anders Carlsson Date: Wed, 16 Dec 2009 06:21:35 +0000 (+0000) Subject: More FullExpr work. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ac7db1fecfa5dbea890b6b57767d52ac12641352;p=clang More FullExpr work. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91514 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/FullExpr.h b/include/clang/AST/FullExpr.h index 5503e67354..bb81bf0fe7 100644 --- a/include/clang/AST/FullExpr.h +++ b/include/clang/AST/FullExpr.h @@ -23,58 +23,66 @@ namespace clang { class CXXTemporary; class Expr; - class FullExpr { - struct ExprAndTemporaries { - Expr *SubExpr; - - unsigned NumTemps; - - typedef CXXTemporary** temps_iterator; - - temps_iterator temps_begin() { - return reinterpret_cast(this + 1); - } - temps_iterator temps_end() { - return temps_begin() + NumTemps; - } - }; - - llvm::PointerUnion SubExpr; - - FullExpr() { } - - public: - static FullExpr Create(ASTContext &Context, Expr *SubExpr, - CXXTemporary **Temps, unsigned NumTemps); - void Destroy(ASTContext &Context); - - Expr *getExpr() { - if (Expr *E = SubExpr.dyn_cast()) - return E; - - return SubExpr.get()->SubExpr; - } +class FullExpr { + struct ExprAndTemporaries { + Expr *SubExpr; - const Expr *getExpr() const { - return const_cast(this)->getExpr(); - } + unsigned NumTemps; typedef CXXTemporary** temps_iterator; - - temps_iterator temps_begin() { - if (ExprAndTemporaries *ET = SubExpr.dyn_cast()) - return ET->temps_begin(); - - return 0; + + temps_iterator temps_begin() { + return reinterpret_cast(this + 1); } - temps_iterator temps_end() { - if (ExprAndTemporaries *ET = SubExpr.dyn_cast()) - return ET->temps_end(); - - return 0; + temps_iterator temps_end() { + return temps_begin() + NumTemps; } }; + + typedef llvm::PointerUnion SubExprTy; + SubExprTy SubExpr; + FullExpr() { } + +public: + static FullExpr Create(ASTContext &Context, Expr *SubExpr, + CXXTemporary **Temps, unsigned NumTemps); + void Destroy(ASTContext &Context); + + Expr *getExpr() { + if (Expr *E = SubExpr.dyn_cast()) + return E; + + return SubExpr.get()->SubExpr; + } + + const Expr *getExpr() const { + return const_cast(this)->getExpr(); + } + + typedef CXXTemporary** temps_iterator; + + temps_iterator temps_begin() { + if (ExprAndTemporaries *ET = SubExpr.dyn_cast()) + return ET->temps_begin(); + + return 0; + } + temps_iterator temps_end() { + if (ExprAndTemporaries *ET = SubExpr.dyn_cast()) + return ET->temps_end(); + + return 0; + } + + void *getAsOpaquePtr() const { return SubExpr.getOpaqueValue(); } + + static FullExpr getFromOpaquePtr(void *Ptr) { + FullExpr E; + E.SubExpr = SubExprTy::getFromOpaqueValue(Ptr); + return E; + } +}; } // end namespace clang