parent
a5ca598ce6
commit
ce5b95c05a
|
@ -23,58 +23,66 @@ namespace clang {
|
||||||
class CXXTemporary;
|
class CXXTemporary;
|
||||||
class Expr;
|
class Expr;
|
||||||
|
|
||||||
class FullExpr {
|
class FullExpr {
|
||||||
struct ExprAndTemporaries {
|
struct ExprAndTemporaries {
|
||||||
Expr *SubExpr;
|
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;
|
|
||||||
|
|
||||||
FullExpr() { }
|
unsigned NumTemps;
|
||||||
|
|
||||||
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;
|
typedef CXXTemporary** temps_iterator;
|
||||||
|
|
||||||
temps_iterator temps_begin() {
|
temps_iterator temps_begin() {
|
||||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
return reinterpret_cast<CXXTemporary **>(this + 1);
|
||||||
return ET->temps_begin();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
temps_iterator temps_end() {
|
temps_iterator temps_end() {
|
||||||
if (ExprAndTemporaries *ET = SubExpr.dyn_cast<ExprAndTemporaries *>())
|
return temps_begin() + NumTemps;
|
||||||
return ET->temps_end();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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
|
} // end namespace clang
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue