}
};
+//===----------------------------------------------------------------------===//
+// ExprIterator - Iterators for iterating over Stmt* arrays that contain
+// only Expr*. This is needed because AST nodes use Stmt* arrays to store
+// references to children (to be compatible with StmtIterator).
+//===----------------------------------------------------------------------===//
+
+class ExprIterator {
+ Stmt** I;
+public:
+ ExprIterator(Stmt** i) : I(i) {}
+ ExprIterator() : I(0) {}
+ ExprIterator& operator++() { ++I; return *this; }
+ ExprIterator operator-(size_t i) { return I-i; }
+ ExprIterator operator+(size_t i) { return I+i; }
+ Expr* operator[](size_t idx) { return cast<Expr>(I[idx]); }
+ // FIXME: Verify that this will correctly return a signed distance.
+ signed operator-(const ExprIterator& R) const { return I - R.I; }
+ Expr* operator*() const { return cast<Expr>(*I); }
+ Expr* operator->() const { return cast<Expr>(*I); }
+ bool operator==(const ExprIterator& R) const { return I == R.I; }
+ bool operator!=(const ExprIterator& R) const { return I != R.I; }
+ bool operator>(const ExprIterator& R) const { return I > R.I; }
+ bool operator>=(const ExprIterator& R) const { return I >= R.I; }
+};
+
+class ConstExprIterator {
+ Stmt* const * I;
+public:
+ ConstExprIterator(Stmt* const* i) : I(i) {}
+ ConstExprIterator() : I(0) {}
+ ConstExprIterator& operator++() { ++I; return *this; }
+ ConstExprIterator operator+(size_t i) { return I+i; }
+ ConstExprIterator operator-(size_t i) { return I-i; }
+ Expr * const operator[](size_t idx) { return cast<Expr>(I[idx]); }
+ signed operator-(const ConstExprIterator& R) const { return I - R.I; }
+ Expr * const operator*() const { return cast<Expr>(*I); }
+ Expr * const operator->() const { return cast<Expr>(*I); }
+ bool operator==(const ConstExprIterator& R) const { return I == R.I; }
+ bool operator!=(const ConstExprIterator& R) const { return I != R.I; }
+ bool operator>(const ConstExprIterator& R) const { return I > R.I; }
+ bool operator>=(const ConstExprIterator& R) const { return I >= R.I; }
+};
+
+
//===----------------------------------------------------------------------===//
// Primary Expressions.
//===----------------------------------------------------------------------===//
/// whose element type matches the subexpression.
///
class ImaginaryLiteral : public Expr {
- Expr *Val;
+ Stmt *Val;
public:
ImaginaryLiteral(Expr *val, QualType Ty)
: Expr(ImaginaryLiteralClass, Ty), Val(val) {}
- const Expr *getSubExpr() const { return Val; }
- Expr *getSubExpr() { return Val; }
+ const Expr *getSubExpr() const { return cast<Expr>(Val); }
+ Expr *getSubExpr() { return cast<Expr>(Val); }
virtual SourceRange getSourceRange() const { return Val->getSourceRange(); }
static bool classof(const Stmt *T) {
/// AST node is only formed if full location information is requested.
class ParenExpr : public Expr {
SourceLocation L, R;
- Expr *Val;
+ Stmt *Val;
public:
ParenExpr(SourceLocation l, SourceLocation r, Expr *val)
: Expr(ParenExprClass, val->getType()), L(l), R(r), Val(val) {}
- const Expr *getSubExpr() const { return Val; }
- Expr *getSubExpr() { return Val; }
+ const Expr *getSubExpr() const { return cast<Expr>(Val); }
+ Expr *getSubExpr() { return cast<Expr>(Val); }
virtual SourceRange getSourceRange() const { return SourceRange(L, R); }
static bool classof(const Stmt *T) {
OffsetOf // __builtin_offsetof
};
private:
- Expr *Val;
+ Stmt *Val;
Opcode Opc;
SourceLocation Loc;
public:
: Expr(UnaryOperatorClass, type), Val(input), Opc(opc), Loc(l) {}
Opcode getOpcode() const { return Opc; }
- Expr *getSubExpr() const { return Val; }
+ Expr *getSubExpr() const { return cast<Expr>(Val); }
/// getOperatorLoc - Return the location of the operator.
SourceLocation getOperatorLoc() const { return Loc; }
/// ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
class ArraySubscriptExpr : public Expr {
enum { LHS, RHS, END_EXPR=2 };
- Expr* SubExprs[END_EXPR];
+ Stmt* SubExprs[END_EXPR];
SourceLocation RBracketLoc;
public:
ArraySubscriptExpr(Expr *lhs, Expr *rhs, QualType t,
/// predicate the format conversion in getBase and getIdx only on the
/// the type of the RHS, as it is possible for the LHS to be a vector of
/// integer type
- Expr *getLHS() { return SubExprs[LHS]; }
- const Expr *getLHS() const { return SubExprs[LHS]; }
+ Expr *getLHS() { return cast<Expr>(SubExprs[LHS]); }
+ const Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
- Expr *getRHS() { return SubExprs[RHS]; }
- const Expr *getRHS() const { return SubExprs[RHS]; }
+ Expr *getRHS() { return cast<Expr>(SubExprs[RHS]); }
+ const Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
Expr *getBase() {
- return (getRHS()->getType()->isIntegerType()) ? getLHS() : getRHS();
+ return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
}
const Expr *getBase() const {
- return (getRHS()->getType()->isIntegerType()) ? getLHS() : getRHS();
+ return cast<Expr>(getRHS()->getType()->isIntegerType() ? getLHS():getRHS());
}
Expr *getIdx() {
- return (getRHS()->getType()->isIntegerType()) ? getRHS() : getLHS();
+ return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
}
const Expr *getIdx() const {
- return (getRHS()->getType()->isIntegerType()) ? getRHS() : getLHS();
+ return cast<Expr>(getRHS()->getType()->isIntegerType() ? getRHS():getLHS());
}
virtual SourceRange getSourceRange() const {
///
class CallExpr : public Expr {
enum { FN=0, ARGS_START=1 };
- Expr **SubExprs;
+ Stmt **SubExprs;
unsigned NumArgs;
SourceLocation RParenLoc;
// This version of the ctor is for deserialization.
- CallExpr(Expr** subexprs, unsigned numargs, QualType t,
+ CallExpr(Stmt** subexprs, unsigned numargs, QualType t,
SourceLocation rparenloc)
: Expr(CallExprClass,t), SubExprs(subexprs),
NumArgs(numargs), RParenLoc(rparenloc) {}
delete [] SubExprs;
}
- const Expr *getCallee() const { return SubExprs[FN]; }
- Expr *getCallee() { return SubExprs[FN]; }
+ const Expr *getCallee() const { return cast<Expr>(SubExprs[FN]); }
+ Expr *getCallee() { return cast<Expr>(SubExprs[FN]); }
void setCallee(Expr *F) { SubExprs[FN] = F; }
/// getNumArgs - Return the number of actual arguments to this call.
/// getArg - Return the specified argument.
Expr *getArg(unsigned Arg) {
assert(Arg < NumArgs && "Arg access out of range!");
- return SubExprs[Arg+ARGS_START];
+ return cast<Expr>(SubExprs[Arg+ARGS_START]);
}
const Expr *getArg(unsigned Arg) const {
assert(Arg < NumArgs && "Arg access out of range!");
- return SubExprs[Arg+ARGS_START];
+ return cast<Expr>(SubExprs[Arg+ARGS_START]);
}
/// setArg - Set the specified argument.
void setArg(unsigned Arg, Expr *ArgExpr) {
/// to null.
void setNumArgs(unsigned NumArgs);
- typedef Expr **arg_iterator;
- typedef Expr * const *arg_const_iterator;
+ typedef ExprIterator arg_iterator;
+ typedef ConstExprIterator const_arg_iterator;
+
arg_iterator arg_begin() { return SubExprs+ARGS_START; }
arg_iterator arg_end() { return SubExprs+ARGS_START+getNumArgs(); }
- arg_const_iterator arg_begin() const { return SubExprs+ARGS_START; }
- arg_const_iterator arg_end() const { return SubExprs+ARGS_START+getNumArgs(); }
-
+ const_arg_iterator arg_begin() const { return SubExprs+ARGS_START; }
+ const_arg_iterator arg_end() const { return SubExprs+ARGS_START+getNumArgs();}
/// getNumCommas - Return the number of commas that must have been present in
/// this function call.
/// MemberExpr - [C99 6.5.2.3] Structure and Union Members.
///
class MemberExpr : public Expr {
- Expr *Base;
+ Stmt *Base;
FieldDecl *MemberDecl;
SourceLocation MemberLoc;
bool IsArrow; // True if this is "X->F", false if this is "X.F".
: Expr(MemberExprClass, ty),
Base(base), MemberDecl(memberdecl), MemberLoc(l), IsArrow(isarrow) {}
- Expr *getBase() const { return Base; }
+ Expr *getBase() const { return cast<Expr>(Base); }
FieldDecl *getMemberDecl() const { return MemberDecl; }
bool isArrow() const { return IsArrow; }
/// the following is legal: "V.xy = V.zw" if V is a 4 element extended vector.
///
class ExtVectorElementExpr : public Expr {
- Expr *Base;
+ Stmt *Base;
IdentifierInfo &Accessor;
SourceLocation AccessorLoc;
public:
: Expr(ExtVectorElementExprClass, ty),
Base(base), Accessor(accessor), AccessorLoc(loc) {}
- const Expr *getBase() const { return Base; }
- Expr *getBase() { return Base; }
+ const Expr *getBase() const { return cast<Expr>(Base); }
+ Expr *getBase() { return cast<Expr>(Base); }
IdentifierInfo &getAccessor() const { return Accessor; }
/// compound literal like "(int){4}". This can be null if this is a
/// synthesized compound expression.
SourceLocation LParenLoc;
- Expr *Init;
+ Stmt *Init;
bool FileScope;
public:
CompoundLiteralExpr(SourceLocation lparenloc, QualType ty, Expr *init, bool fileScope) :
Expr(CompoundLiteralExprClass, ty), LParenLoc(lparenloc), Init(init), FileScope(fileScope) {}
- const Expr *getInitializer() const { return Init; }
- Expr *getInitializer() { return Init; }
+ const Expr *getInitializer() const { return cast<Expr>(Init); }
+ Expr *getInitializer() { return cast<Expr>(Init); }
bool isFileScope() const { return FileScope; }
/// float->double, short->int, etc.
///
class ImplicitCastExpr : public Expr {
- Expr *Op;
+ Stmt *Op;
public:
ImplicitCastExpr(QualType ty, Expr *op) :
Expr(ImplicitCastExprClass, ty), Op(op) {}
- Expr *getSubExpr() { return Op; }
- const Expr *getSubExpr() const { return Op; }
+ Expr *getSubExpr() { return cast<Expr>(Op); }
+ const Expr *getSubExpr() const { return cast<Expr>(Op); }
virtual SourceRange getSourceRange() const { return Op->getSourceRange(); }
/// CastExpr - [C99 6.5.4] Cast Operators.
///
class CastExpr : public Expr {
- Expr *Op;
+ Stmt *Op;
SourceLocation Loc; // the location of the left paren
public:
CastExpr(QualType ty, Expr *op, SourceLocation l) :
SourceLocation getLParenLoc() const { return Loc; }
- Expr *getSubExpr() const { return Op; }
+ Expr *getSubExpr() const { return cast<Expr>(Op); }
virtual SourceRange getSourceRange() const {
return SourceRange(Loc, getSubExpr()->getSourceRange().getEnd());
};
private:
enum { LHS, RHS, END_EXPR };
- Expr* SubExprs[END_EXPR];
+ Stmt* SubExprs[END_EXPR];
Opcode Opc;
SourceLocation OpLoc;
public:
SourceLocation getOperatorLoc() const { return OpLoc; }
Opcode getOpcode() const { return Opc; }
- Expr *getLHS() const { return SubExprs[LHS]; }
- Expr *getRHS() const { return SubExprs[RHS]; }
+ Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
+ Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
virtual SourceRange getSourceRange() const {
return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd());
}
///
class ConditionalOperator : public Expr {
enum { COND, LHS, RHS, END_EXPR };
- Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
+ Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
public:
ConditionalOperator(Expr *cond, Expr *lhs, Expr *rhs, QualType t)
: Expr(ConditionalOperatorClass, t) {
// getCond - Return the expression representing the condition for
// the ?: operator.
- Expr *getCond() const { return SubExprs[COND]; }
+ Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
// getTrueExpr - Return the subexpression representing the value of the ?:
// expression if the condition evaluates to true. In most cases this value
// e.g: x ?: y is shorthand for x ? x : y, except that the expression "x"
// is only evaluated once.
Expr *getTrueExpr() const {
- return SubExprs[LHS] ? SubExprs[LHS] : SubExprs[COND];
+ return cast<Expr>(SubExprs[LHS] ? SubExprs[LHS] : SubExprs[COND]);
}
// getTrueExpr - Return the subexpression representing the value of the ?:
// expression if the condition evaluates to false. This is the same as getRHS.
- Expr *getFalseExpr() const { return SubExprs[RHS]; }
+ Expr *getFalseExpr() const { return cast<Expr>(SubExprs[RHS]); }
- Expr *getLHS() const { return SubExprs[LHS]; }
- Expr *getRHS() const { return SubExprs[RHS]; }
+ Expr *getLHS() const { return cast_or_null<Expr>(SubExprs[LHS]); }
+ Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
virtual SourceRange getSourceRange() const {
return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd());
/// The StmtExpr contains a single CompoundStmt node, which it evaluates and
/// takes the value of the last subexpression.
class StmtExpr : public Expr {
- CompoundStmt *SubStmt;
+ Stmt *SubStmt;
SourceLocation LParenLoc, RParenLoc;
public:
StmtExpr(CompoundStmt *substmt, QualType T,
SourceLocation lp, SourceLocation rp) :
Expr(StmtExprClass, T), SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { }
- CompoundStmt *getSubStmt() { return SubStmt; }
- const CompoundStmt *getSubStmt() const { return SubStmt; }
+ CompoundStmt *getSubStmt() { return cast<CompoundStmt>(SubStmt); }
+ const CompoundStmt *getSubStmt() const { return cast<CompoundStmt>(SubStmt); }
virtual SourceRange getSourceRange() const {
return SourceRange(LParenLoc, RParenLoc);
// function. The first two are vectors, and the rest are constant
// indices. The number of values in this list is always
// 2+the number of indices in the vector type.
- Expr **SubExprs;
+ Stmt **SubExprs;
unsigned NumExprs;
public:
Expr(ShuffleVectorExprClass, Type), BuiltinLoc(BLoc),
RParenLoc(RP), NumExprs(nexpr) {
- SubExprs = new Expr*[nexpr];
+ SubExprs = new Stmt*[nexpr];
for (unsigned i = 0; i < nexpr; i++)
SubExprs[i] = args[i];
}
/// getExpr - Return the Expr at the specified index.
Expr *getExpr(unsigned Index) {
assert((Index < NumExprs) && "Arg access out of range!");
- return SubExprs[Index];
+ return cast<Expr>(SubExprs[Index]);
}
const Expr *getExpr(unsigned Index) const {
assert((Index < NumExprs) && "Arg access out of range!");
- return SubExprs[Index];
+ return cast<Expr>(SubExprs[Index]);
}
unsigned getShuffleMaskIdx(ASTContext &Ctx, unsigned N) {
/// - does not evaluate the expression that was not chosen.
class ChooseExpr : public Expr {
enum { COND, LHS, RHS, END_EXPR };
- Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
+ Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
SourceLocation BuiltinLoc, RParenLoc;
public:
ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
/// statically knowable for a well-formed choosexpr.
bool isConditionTrue(ASTContext &C) const;
- Expr *getCond() const { return SubExprs[COND]; }
- Expr *getLHS() const { return SubExprs[LHS]; }
- Expr *getRHS() const { return SubExprs[RHS]; }
+ Expr *getCond() const { return cast<Expr>(SubExprs[COND]); }
+ Expr *getLHS() const { return cast<Expr>(SubExprs[LHS]); }
+ Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
virtual SourceRange getSourceRange() const {
return SourceRange(BuiltinLoc, RParenLoc);
// SubExpr[0] is a constant expression
// SubExpr[1-N] are the parameters to pass to the matching function call
// SubExpr[N-...] are the candidate functions, of type pointer to function.
- Expr **SubExprs;
+ Stmt **SubExprs;
// NumExprs - the size of the SubExprs array
unsigned NumExprs;
SourceLocation bloc, SourceLocation rploc)
: Expr(OverloadExprClass, t), NumExprs(nexprs), FnIndex(idx),
BuiltinLoc(bloc), RParenLoc(rploc) {
- SubExprs = new Expr*[nexprs];
+ SubExprs = new Stmt*[nexprs];
for (unsigned i = 0; i != nexprs; ++i)
SubExprs[i] = args[i];
}
/// arg_begin - Return a pointer to the list of arguments that will be passed
/// to the matching candidate function, skipping over the initial constant
/// expression.
- typedef Expr * const *arg_const_iterator;
- arg_const_iterator arg_begin() const { return SubExprs+1; }
-
+ typedef ConstExprIterator const_arg_iterator;
+ const_arg_iterator arg_begin() const { return &SubExprs[0]+1; }
+ const_arg_iterator arg_end(ASTContext& Ctx) const {
+ return &SubExprs[0]+1+getNumArgs(Ctx);
+ }
+
/// getNumArgs - Return the number of arguments to pass to the candidate
/// functions.
unsigned getNumArgs(ASTContext &Ctx) const {
llvm::APSInt constEval(32);
- (void) SubExprs[0]->isIntegerConstantExpr(constEval, Ctx);
+ (void) cast<Expr>(SubExprs[0])->isIntegerConstantExpr(constEval, Ctx);
return constEval.getZExtValue();
}
/// getExpr - Return the Expr at the specified index.
Expr *getExpr(unsigned Index) {
assert((Index < NumExprs) && "Arg access out of range!");
- return SubExprs[Index];
+ return cast<Expr>(SubExprs[Index]);
}
/// getFn - Return the matching candidate function for this OverloadExpr.
- Expr *getFn() const { return SubExprs[FnIndex]; }
+ Expr *getFn() const { return cast<Expr>(SubExprs[FnIndex]); }
virtual SourceRange getSourceRange() const {
return SourceRange(BuiltinLoc, RParenLoc);
/// VAArgExpr, used for the builtin function __builtin_va_start.
class VAArgExpr : public Expr {
- Expr *Val;
+ Stmt *Val;
SourceLocation BuiltinLoc, RParenLoc;
public:
VAArgExpr(SourceLocation BLoc, Expr* e, QualType t, SourceLocation RPLoc)
BuiltinLoc(BLoc),
RParenLoc(RPLoc) { }
- const Expr *getSubExpr() const { return Val; }
- Expr *getSubExpr() { return Val; }
+ const Expr *getSubExpr() const { return cast<Expr>(Val); }
+ Expr *getSubExpr() { return cast<Expr>(Val); }
virtual SourceRange getSourceRange() const {
return SourceRange(BuiltinLoc, RParenLoc);
}
/// int x = { 1 }; int y[2] = { {1}, {2} };
///
class InitListExpr : public Expr {
- std::vector<Expr *> InitExprs;
+ std::vector<Stmt *> InitExprs;
SourceLocation LBraceLoc, RBraceLoc;
public:
InitListExpr(SourceLocation lbraceloc, Expr **initexprs, unsigned numinits,
const Expr* getInit(unsigned Init) const {
assert(Init < getNumInits() && "Initializer access out of range!");
- return InitExprs[Init];
+ return cast<Expr>(InitExprs[Init]);
}
Expr* getInit(unsigned Init) {
assert(Init < getNumInits() && "Initializer access out of range!");
- return InitExprs[Init];
+ return cast<Expr>(InitExprs[Init]);
}
void setInit(unsigned Init, Expr *expr) {
CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t,
SourceLocation rparenloc)
: Expr(CallExprClass, t), NumArgs(numargs) {
- SubExprs = new Expr*[numargs+1];
+ SubExprs = new Stmt*[numargs+1];
SubExprs[FN] = fn;
for (unsigned i = 0; i != numargs; ++i)
SubExprs[i+ARGS_START] = args[i];
}
// Otherwise, we are growing the # arguments. New an bigger argument array.
- Expr **NewSubExprs = new Expr*[NumArgs+1];
+ Stmt **NewSubExprs = new Stmt*[NumArgs+1];
// Copy over args.
for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i)
NewSubExprs[i] = SubExprs[i];
: Expr(ObjCMessageExprClass, retType), SelName(selInfo),
MethodProto(mproto) {
NumArgs = nargs;
- SubExprs = new Expr*[NumArgs+1];
+ SubExprs = new Stmt*[NumArgs+1];
SubExprs[RECEIVER] = receiver;
if (NumArgs) {
for (unsigned i = 0; i != NumArgs; ++i)
: Expr(ObjCMessageExprClass, retType), SelName(selInfo),
MethodProto(mproto) {
NumArgs = nargs;
- SubExprs = new Expr*[NumArgs+1];
+ SubExprs = new Stmt*[NumArgs+1];
SubExprs[RECEIVER] = (Expr*) ((uintptr_t) clsName | 0x1);
if (NumArgs) {
for (unsigned i = 0; i != NumArgs; ++i)
assert(Opc == OffsetOf && "Unary operator not offsetof!");
unsigned CharSize = C.Target.getCharWidth();
- return ::evaluateOffsetOf(C, Val) / CharSize;
+ return ::evaluateOffsetOf(C, cast<Expr>(Val)) / CharSize;
}
//===----------------------------------------------------------------------===//
Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
// ObjCIvarRefExpr
-Stmt::child_iterator ObjCIvarRefExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Base);
-}
-
-Stmt::child_iterator ObjCIvarRefExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Base)+1;
-}
+Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
+Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
// ObjCPropertyRefExpr
-Stmt::child_iterator ObjCPropertyRefExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Base);
-}
-
-Stmt::child_iterator ObjCPropertyRefExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Base)+1;
-}
+Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; }
+Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
// ObjCSuperRefExpr
Stmt::child_iterator ObjCSuperRefExpr::child_begin() { return child_iterator();}
Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
// ImaginaryLiteral
-Stmt::child_iterator ImaginaryLiteral::child_begin() {
- return reinterpret_cast<Stmt**>(&Val);
-}
-Stmt::child_iterator ImaginaryLiteral::child_end() {
- return reinterpret_cast<Stmt**>(&Val)+1;
-}
+Stmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; }
+Stmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; }
// StringLiteral
Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
// ParenExpr
-Stmt::child_iterator ParenExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Val);
-}
-Stmt::child_iterator ParenExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Val)+1;
-}
+Stmt::child_iterator ParenExpr::child_begin() { return &Val; }
+Stmt::child_iterator ParenExpr::child_end() { return &Val+1; }
// UnaryOperator
-Stmt::child_iterator UnaryOperator::child_begin() {
- return reinterpret_cast<Stmt**>(&Val);
-}
-Stmt::child_iterator UnaryOperator::child_end() {
- return reinterpret_cast<Stmt**>(&Val+1);
-}
+Stmt::child_iterator UnaryOperator::child_begin() { return &Val; }
+Stmt::child_iterator UnaryOperator::child_end() { return &Val+1; }
// SizeOfAlignOfTypeExpr
Stmt::child_iterator SizeOfAlignOfTypeExpr::child_begin() {
// ArraySubscriptExpr
Stmt::child_iterator ArraySubscriptExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs);
+ return &SubExprs[0];
}
Stmt::child_iterator ArraySubscriptExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
+ return &SubExprs[0]+END_EXPR;
}
// CallExpr
Stmt::child_iterator CallExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs[0]);
+ return &SubExprs[0];
}
Stmt::child_iterator CallExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs[NumArgs+ARGS_START]);
+ return &SubExprs[0]+NumArgs+ARGS_START;
}
// MemberExpr
-Stmt::child_iterator MemberExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Base);
-}
-Stmt::child_iterator MemberExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Base)+1;
-}
+Stmt::child_iterator MemberExpr::child_begin() { return &Base; }
+Stmt::child_iterator MemberExpr::child_end() { return &Base+1; }
// ExtVectorElementExpr
-Stmt::child_iterator ExtVectorElementExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Base);
-}
-Stmt::child_iterator ExtVectorElementExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Base)+1;
-}
+Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; }
+Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; }
// CompoundLiteralExpr
-Stmt::child_iterator CompoundLiteralExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Init);
-}
-Stmt::child_iterator CompoundLiteralExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Init)+1;
-}
+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 reinterpret_cast<Stmt**>(&Op);
-}
-Stmt::child_iterator ImplicitCastExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Op)+1;
-}
+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 reinterpret_cast<Stmt**>(&Op);
-}
-Stmt::child_iterator CastExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Op)+1;
-}
+Stmt::child_iterator CastExpr::child_begin() { return &Op; }
+Stmt::child_iterator CastExpr::child_end() { return &Op+1; }
// BinaryOperator
Stmt::child_iterator BinaryOperator::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs);
+ return &SubExprs[0];
}
Stmt::child_iterator BinaryOperator::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
+ return &SubExprs[0]+END_EXPR;
}
// ConditionalOperator
Stmt::child_iterator ConditionalOperator::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs);
+ return &SubExprs[0];
}
Stmt::child_iterator ConditionalOperator::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
+ return &SubExprs[0]+END_EXPR;
}
// AddrLabelExpr
Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
// StmtExpr
-Stmt::child_iterator StmtExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubStmt);
-}
-Stmt::child_iterator StmtExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubStmt)+1;
-}
+Stmt::child_iterator StmtExpr::child_begin() { return &SubStmt; }
+Stmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; }
// TypesCompatibleExpr
Stmt::child_iterator TypesCompatibleExpr::child_begin() {
}
// ChooseExpr
-Stmt::child_iterator ChooseExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs);
-}
-
-Stmt::child_iterator ChooseExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
-}
+Stmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; }
+Stmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; }
// OverloadExpr
-Stmt::child_iterator OverloadExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs[0]);
-}
-Stmt::child_iterator OverloadExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs[NumExprs]);
-}
+Stmt::child_iterator OverloadExpr::child_begin() { return &SubExprs[0]; }
+Stmt::child_iterator OverloadExpr::child_end() { return &SubExprs[0]+NumExprs; }
// ShuffleVectorExpr
Stmt::child_iterator ShuffleVectorExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs[0]);
+ return &SubExprs[0];
}
Stmt::child_iterator ShuffleVectorExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs[NumExprs]);
+ return &SubExprs[0]+NumExprs;
}
// VAArgExpr
-Stmt::child_iterator VAArgExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&Val);
-}
-
-Stmt::child_iterator VAArgExpr::child_end() {
- return reinterpret_cast<Stmt**>(&Val)+1;
-}
+Stmt::child_iterator VAArgExpr::child_begin() { return &Val; }
+Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
// InitListExpr
Stmt::child_iterator InitListExpr::child_begin() {
- return reinterpret_cast<Stmt**>(InitExprs.size() ?
- &InitExprs[0] : 0);
+ return InitExprs.size() ? &InitExprs[0] : 0;
}
Stmt::child_iterator InitListExpr::child_end() {
- return reinterpret_cast<Stmt**>(InitExprs.size() ?
- &InitExprs[0] + InitExprs.size() : 0);
+ return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
}
// ObjCStringLiteral
// ObjCMessageExpr
Stmt::child_iterator ObjCMessageExpr::child_begin() {
- return reinterpret_cast<Stmt**>(&SubExprs[ getReceiver() ? 0 : ARGS_START ]);
+ return getReceiver() ? &SubExprs[0] : &SubExprs[0] + ARGS_START;
}
Stmt::child_iterator ObjCMessageExpr::child_end() {
- return reinterpret_cast<Stmt**>(&SubExprs[getNumArgs()+ARGS_START]);
+ return &SubExprs[0]+ARGS_START+getNumArgs();
}