//===----------------------------------------------------------------------===//
// DeclRefExpr
-Stmt::child_iterator DeclRefExpr::child_begin() { return NULL; }
-Stmt::child_iterator DeclRefExpr::child_end() { return NULL; }
+Stmt::child_iterator DeclRefExpr::child_begin() { return NULL; }
+Stmt::child_iterator DeclRefExpr::child_end() { return NULL; }
// PreDefinedExpr
-Stmt::child_iterator PreDefinedExpr::child_begin() { return NULL; }
-Stmt::child_iterator PreDefinedExpr::child_end() { return NULL; }
+Stmt::child_iterator PreDefinedExpr::child_begin() { return NULL; }
+Stmt::child_iterator PreDefinedExpr::child_end() { return NULL; }
// IntegerLiteral
-Stmt::child_iterator IntegerLiteral::child_begin() { return NULL; }
-Stmt::child_iterator IntegerLiteral::child_end() { return NULL; }
+Stmt::child_iterator IntegerLiteral::child_begin() { return NULL; }
+Stmt::child_iterator IntegerLiteral::child_end() { return NULL; }
// CharacterLiteral
-Stmt::child_iterator CharacterLiteral::child_begin() { return NULL; }
-Stmt::child_iterator CharacterLiteral::child_end() { return NULL; }
+Stmt::child_iterator CharacterLiteral::child_begin() { return NULL; }
+Stmt::child_iterator CharacterLiteral::child_end() { return NULL; }
// FloatingLiteral
-Stmt::child_iterator FloatingLiteral::child_begin() { return NULL; }
-Stmt::child_iterator FloatingLiteral::child_end() { return NULL; }
+Stmt::child_iterator FloatingLiteral::child_begin() { return NULL; }
+Stmt::child_iterator FloatingLiteral::child_end() { return NULL; }
// StringLiteral
-Stmt::child_iterator StringLiteral::child_begin() { return NULL; }
-Stmt::child_iterator StringLiteral::child_end() { return NULL; }
+Stmt::child_iterator StringLiteral::child_begin() { return NULL; }
+Stmt::child_iterator StringLiteral::child_end() { return NULL; }
// ParenExpr
Stmt::child_iterator ParenExpr::child_begin() {
}
// SizeOfAlignOfTypeExpr
-Stmt::child_iterator SizeOfAlignOfTypeExpr::child_begin() {
+Stmt::child_iterator SizeOfAlignOfTypeExpr::child_begin() {
return NULL;
}
-Stmt::child_iterator SizeOfAlignOfTypeExpr::child_end() {
+Stmt::child_iterator SizeOfAlignOfTypeExpr::child_end() {
return NULL;
}
// ArraySubscriptExpr
-Stmt::child_iterator ArraySubscriptExpr::child_begin() {
+Stmt::child_iterator ArraySubscriptExpr::child_begin() {
return reinterpret_cast<Stmt**>(&SubExprs);
}
-Stmt::child_iterator ArraySubscriptExpr::child_end() {
+Stmt::child_iterator ArraySubscriptExpr::child_end() {
return child_begin()+END_EXPR;
}
// CallExpr
-Stmt::child_iterator CallExpr::child_begin() {
+Stmt::child_iterator CallExpr::child_begin() {
return reinterpret_cast<Stmt**>(&SubExprs);
}
-Stmt::child_iterator CallExpr::child_end() {
+Stmt::child_iterator CallExpr::child_end() {
return child_begin()+NumArgs+ARGS_START;
}
+
+// MemberExpr
+Stmt::child_iterator MemberExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&Base);
+}
+
+Stmt::child_iterator MemberExpr::child_end() {
+ return child_begin()+1;
+}
+
+// OCUVectorElementExpr
+Stmt::child_iterator OCUVectorElementExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&Base);
+}
+
+Stmt::child_iterator OCUVectorElementExpr::child_end() {
+ return child_begin()+1;
+}
+
+// CompoundLiteralExpr
+Stmt::child_iterator CompoundLiteralExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&Init);
+}
+
+Stmt::child_iterator CompoundLiteralExpr::child_end() {
+ return child_begin()+1;
+}
+
+// ImplicitCastExpr
+Stmt::child_iterator ImplicitCastExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&Op);
+}
+
+Stmt::child_iterator ImplicitCastExpr::child_end() {
+ return child_begin()+1;
+}
+
+// CastExpr
+Stmt::child_iterator CastExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&Op);
+}
+
+Stmt::child_iterator CastExpr::child_end() {
+ return child_begin()+1;
+}
+
+// BinaryOperator
+Stmt::child_iterator BinaryOperator::child_begin() {
+ return reinterpret_cast<Stmt**>(&SubExprs);
+}
+
+Stmt::child_iterator BinaryOperator::child_end() {
+ return child_begin()+END_EXPR;
+}
+
+// ConditionalOperator
+Stmt::child_iterator ConditionalOperator::child_begin() {
+ return reinterpret_cast<Stmt**>(&SubExprs);
+}
+
+Stmt::child_iterator ConditionalOperator::child_end() {
+ return child_begin()+END_EXPR;
+}
+
+// AddrLabelExpr
+Stmt::child_iterator AddrLabelExpr::child_begin() { return NULL; }
+Stmt::child_iterator AddrLabelExpr::child_end() { return NULL; }
+
+
+// StmtExpr
+Stmt::child_iterator StmtExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&SubStmt);
+}
+
+Stmt::child_iterator StmtExpr::child_end() {
+ return child_begin()+1;
+}
+
+// TypesCompatibleExpr
+Stmt::child_iterator TypesCompatibleExpr::child_begin() { return NULL; }
+Stmt::child_iterator TypesCompatibleExpr::child_end() { return NULL; }
+
+// ChooseExpr
+Stmt::child_iterator ChooseExpr::child_begin() {
+ return reinterpret_cast<Stmt**>(&SubExprs);
+}
+
+Stmt::child_iterator ChooseExpr::child_end() {
+ return child_begin()+END_EXPR;
+}
+
+// ObjCStringLiteral
+Stmt::child_iterator ObjCStringLiteral::child_begin() { return NULL; }
+Stmt::child_iterator ObjCStringLiteral::child_end() { return NULL; }
+
+// ObjCEncodeExpr
+Stmt::child_iterator ObjCEncodeExpr::child_begin() { return NULL; }
+Stmt::child_iterator ObjCEncodeExpr::child_end() { return NULL; }
+
return T->getStmtClass() == MemberExprClass;
}
static bool classof(const MemberExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// OCUVectorElementExpr - This represents access to specific elements of a
return T->getStmtClass() == OCUVectorElementExprClass;
}
static bool classof(const OCUVectorElementExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// CompoundLiteralExpr - [C99 6.5.2.5]
return T->getStmtClass() == CompoundLiteralExprClass;
}
static bool classof(const CompoundLiteralExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// ImplicitCastExpr - Allows us to explicitly represent implicit type
return T->getStmtClass() == ImplicitCastExprClass;
}
static bool classof(const ImplicitCastExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// CastExpr - [C99 6.5.4] Cast Operators.
return T->getStmtClass() == CastExprClass;
}
static bool classof(const CastExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
class BinaryOperator : public Expr {
};
BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy)
- : Expr(BinaryOperatorClass, ResTy), LHS(lhs), RHS(rhs), Opc(opc) {
+ : Expr(BinaryOperatorClass, ResTy), Opc(opc) {
+ SubExprs[LHS] = lhs;
+ SubExprs[RHS] = rhs;
assert(!isCompoundAssignmentOp() &&
"Use ArithAssignBinaryOperator for compound assignments");
}
Opcode getOpcode() const { return Opc; }
- Expr *getLHS() const { return LHS; }
- Expr *getRHS() const { return RHS; }
+ Expr *getLHS() const { return SubExprs[LHS]; }
+ Expr *getRHS() const { return SubExprs[RHS]; }
virtual SourceRange getSourceRange() const {
return SourceRange(getLHS()->getLocStart(), getRHS()->getLocEnd());
}
return T->getStmtClass() == BinaryOperatorClass;
}
static bool classof(const BinaryOperator *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
+
private:
- Expr *LHS, *RHS;
+ enum { LHS, RHS, END_EXPR };
+ Expr* SubExprs[END_EXPR];
Opcode Opc;
+
protected:
BinaryOperator(Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, bool dead)
- : Expr(BinaryOperatorClass, ResTy), LHS(lhs), RHS(rhs), Opc(opc) {
+ : Expr(BinaryOperatorClass, ResTy), Opc(opc) {
+ SubExprs[LHS] = lhs;
+ SubExprs[RHS] = rhs;
}
};
/// GNU "missing LHS" extension is in use.
///
class ConditionalOperator : public Expr {
- Expr *Cond, *LHS, *RHS; // Left/Middle/Right hand sides.
+ enum { COND, LHS, RHS, END_EXPR };
+ Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
public:
ConditionalOperator(Expr *cond, Expr *lhs, Expr *rhs, QualType t)
- : Expr(ConditionalOperatorClass, t), Cond(cond), LHS(lhs), RHS(rhs) {}
+ : Expr(ConditionalOperatorClass, t) {
+ SubExprs[COND] = cond;
+ SubExprs[LHS] = lhs;
+ SubExprs[RHS] = rhs;
+ }
- Expr *getCond() const { return Cond; }
- Expr *getLHS() const { return LHS; }
- Expr *getRHS() const { return RHS; }
+ Expr *getCond() const { return SubExprs[COND]; }
+ Expr *getLHS() const { return SubExprs[LHS]; }
+ Expr *getRHS() const { return SubExprs[RHS]; }
virtual SourceRange getSourceRange() const {
return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd());
return T->getStmtClass() == ConditionalOperatorClass;
}
static bool classof(const ConditionalOperator *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// AddrLabelExpr - The GNU address of label extension, representing &&label.
return T->getStmtClass() == AddrLabelExprClass;
}
static bool classof(const AddrLabelExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
return T->getStmtClass() == StmtExprClass;
}
static bool classof(const StmtExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// TypesCompatibleExpr - GNU builtin-in function __builtin_type_compatible_p.
return T->getStmtClass() == TypesCompatibleExprClass;
}
static bool classof(const TypesCompatibleExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// ChooseExpr - GNU builtin-in function __builtin_choose_expr.
/// - the expression returned has it's type unaltered by promotion rules.
/// - does not evaluate the expression that was not chosen.
class ChooseExpr : public Expr {
- Expr *Cond, *LHS, *RHS; // First, second, and third arguments.
+ enum { COND, LHS, RHS, END_EXPR };
+ Expr* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
SourceLocation BuiltinLoc, RParenLoc;
public:
ChooseExpr(SourceLocation BLoc, Expr *cond, Expr *lhs, Expr *rhs, QualType t,
SourceLocation RP)
: Expr(ChooseExprClass, t),
- Cond(cond), LHS(lhs), RHS(rhs), BuiltinLoc(BLoc), RParenLoc(RP) {}
-
- Expr *getCond() { return Cond; }
- Expr *getLHS() { return LHS; }
- Expr *getRHS() { return RHS; }
-
- const Expr *getCond() const { return Cond; }
- const Expr *getLHS() const { return LHS; }
- const Expr *getRHS() const { return RHS; }
+ BuiltinLoc(BLoc), RParenLoc(RP) {
+ SubExprs[COND] = cond;
+ SubExprs[LHS] = lhs;
+ SubExprs[RHS] = rhs;
+ }
+ Expr *getCond() const { return SubExprs[COND]; }
+ Expr *getLHS() const { return SubExprs[LHS]; }
+ Expr *getRHS() const { return SubExprs[RHS]; }
+
virtual SourceRange getSourceRange() const {
return SourceRange(BuiltinLoc, RParenLoc);
}
return T->getStmtClass() == ChooseExprClass;
}
static bool classof(const ChooseExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// ObjCStringLiteral, used for Objective-C string literals
return T->getStmtClass() == ObjCStringLiteralClass;
}
static bool classof(const ObjCStringLiteral *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
/// ObjCEncodeExpr, used for @encode in Objective-C.
return T->getStmtClass() == ObjCEncodeExprClass;
}
static bool classof(const ObjCEncodeExpr *) { return true; }
+
+ // Iterators
+ virtual child_iterator child_begin();
+ virtual child_iterator child_end();
};
} // end namespace clang