forked from OSchip/llvm-project
parent
a5ca598ce6
commit
ce5b95c05a
|
@ -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<CXXTemporary **>(this + 1);
|
||||
}
|
||||
temps_iterator temps_end() {
|
||||
return temps_begin() + NumTemps;
|
||||
}
|
||||
};
|
||||
|
||||
llvm::PointerUnion<Expr *, ExprAndTemporaries *> SubExpr;
|
||||
class FullExpr {
|
||||
struct ExprAndTemporaries {
|
||||
Expr *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<Expr *>())
|
||||
return E;
|
||||
|
||||
return SubExpr.get<ExprAndTemporaries *>()->SubExpr;
|
||||
}
|
||||
|
||||
const Expr *getExpr() const {
|
||||
return const_cast<FullExpr*>(this)->getExpr();
|
||||
}
|
||||
unsigned NumTemps;
|
||||
|
||||
typedef CXXTemporary** temps_iterator;
|
||||
|
||||
temps_iterator temps_begin() {
|
||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
||||
return ET->temps_begin();
|
||||
|
||||
return 0;
|
||||
|
||||
temps_iterator temps_begin() {
|
||||
return reinterpret_cast<CXXTemporary **>(this + 1);
|
||||
}
|
||||
temps_iterator temps_end() {
|
||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
||||
return ET->temps_end();
|
||||
|
||||
return 0;
|
||||
temps_iterator temps_end() {
|
||||
return temps_begin() + NumTemps;
|
||||
}
|
||||
};
|
||||
|
||||
typedef llvm::PointerUnion<Expr *, ExprAndTemporaries *> 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<Expr *>())
|
||||
return E;
|
||||
|
||||
return SubExpr.get<ExprAndTemporaries *>()->SubExpr;
|
||||
}
|
||||
|
||||
const Expr *getExpr() const {
|
||||
return const_cast<FullExpr*>(this)->getExpr();
|
||||
}
|
||||
|
||||
typedef CXXTemporary** temps_iterator;
|
||||
|
||||
temps_iterator temps_begin() {
|
||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
||||
return ET->temps_begin();
|
||||
|
||||
return 0;
|
||||
}
|
||||
temps_iterator temps_end() {
|
||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue