Expr.cpp revision 211f6adf1301a1461015fb6cb08a05f0a35b65f3
1//===--- Expr.cpp - Expression AST Node Implementation --------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the Expr class and subclasses.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/AST/Expr.h"
15#include "clang/AST/ASTContext.h"
16#include "clang/AST/StmtVisitor.h"
17#include "clang/Basic/IdentifierTable.h"
18#include "clang/Basic/TargetInfo.h"
19using namespace clang;
20
21//===----------------------------------------------------------------------===//
22// Primary Expressions.
23//===----------------------------------------------------------------------===//
24
25StringLiteral::StringLiteral(const char *strData, unsigned byteLength,
26                             bool Wide, QualType t, SourceLocation firstLoc,
27                             SourceLocation lastLoc) :
28  Expr(StringLiteralClass, t) {
29  // OPTIMIZE: could allocate this appended to the StringLiteral.
30  char *AStrData = new char[byteLength];
31  memcpy(AStrData, strData, byteLength);
32  StrData = AStrData;
33  ByteLength = byteLength;
34  IsWide = Wide;
35  firstTokLoc = firstLoc;
36  lastTokLoc = lastLoc;
37}
38
39StringLiteral::~StringLiteral() {
40  delete[] StrData;
41}
42
43bool UnaryOperator::isPostfix(Opcode Op) {
44  switch (Op) {
45  case PostInc:
46  case PostDec:
47    return true;
48  default:
49    return false;
50  }
51}
52
53/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
54/// corresponds to, e.g. "sizeof" or "[pre]++".
55const char *UnaryOperator::getOpcodeStr(Opcode Op) {
56  switch (Op) {
57  default: assert(0 && "Unknown unary operator");
58  case PostInc: return "++";
59  case PostDec: return "--";
60  case PreInc:  return "++";
61  case PreDec:  return "--";
62  case AddrOf:  return "&";
63  case Deref:   return "*";
64  case Plus:    return "+";
65  case Minus:   return "-";
66  case Not:     return "~";
67  case LNot:    return "!";
68  case Real:    return "__real";
69  case Imag:    return "__imag";
70  case SizeOf:  return "sizeof";
71  case AlignOf: return "alignof";
72  case Extension: return "__extension__";
73  case OffsetOf: return "__builtin_offsetof";
74  }
75}
76
77//===----------------------------------------------------------------------===//
78// Postfix Operators.
79//===----------------------------------------------------------------------===//
80
81
82CallExpr::CallExpr(Expr *fn, Expr **args, unsigned numargs, QualType t,
83                   SourceLocation rparenloc)
84  : Expr(CallExprClass, t), NumArgs(numargs) {
85  SubExprs = new Expr*[numargs+1];
86  SubExprs[FN] = fn;
87  for (unsigned i = 0; i != numargs; ++i)
88    SubExprs[i+ARGS_START] = args[i];
89  RParenLoc = rparenloc;
90}
91
92/// setNumArgs - This changes the number of arguments present in this call.
93/// Any orphaned expressions are deleted by this, and any new operands are set
94/// to null.
95void CallExpr::setNumArgs(unsigned NumArgs) {
96  // No change, just return.
97  if (NumArgs == getNumArgs()) return;
98
99  // If shrinking # arguments, just delete the extras and forgot them.
100  if (NumArgs < getNumArgs()) {
101    for (unsigned i = NumArgs, e = getNumArgs(); i != e; ++i)
102      delete getArg(i);
103    this->NumArgs = NumArgs;
104    return;
105  }
106
107  // Otherwise, we are growing the # arguments.  New an bigger argument array.
108  Expr **NewSubExprs = new Expr*[NumArgs+1];
109  // Copy over args.
110  for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i)
111    NewSubExprs[i] = SubExprs[i];
112  // Null out new args.
113  for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i)
114    NewSubExprs[i] = 0;
115
116  delete[] SubExprs;
117  SubExprs = NewSubExprs;
118  this->NumArgs = NumArgs;
119}
120
121bool CallExpr::isBuiltinConstantExpr() const {
122  // All simple function calls (e.g. func()) are implicitly cast to pointer to
123  // function. As a result, we try and obtain the DeclRefExpr from the
124  // ImplicitCastExpr.
125  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
126  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
127    return false;
128
129  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
130  if (!DRE)
131    return false;
132
133  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
134  if (!FDecl)
135    return false;
136
137  unsigned builtinID = FDecl->getIdentifier()->getBuiltinID();
138  if (!builtinID)
139    return false;
140
141  // We have a builtin that is a constant expression
142  return builtinID == Builtin::BI__builtin___CFStringMakeConstantString ||
143         builtinID == Builtin::BI__builtin_classify_type;
144}
145
146bool CallExpr::isBuiltinClassifyType(llvm::APSInt &Result) const {
147  // The following enum mimics gcc's internal "typeclass.h" file.
148  enum gcc_type_class {
149    no_type_class = -1,
150    void_type_class, integer_type_class, char_type_class,
151    enumeral_type_class, boolean_type_class,
152    pointer_type_class, reference_type_class, offset_type_class,
153    real_type_class, complex_type_class,
154    function_type_class, method_type_class,
155    record_type_class, union_type_class,
156    array_type_class, string_type_class,
157    lang_type_class
158  };
159  Result.setIsSigned(true);
160
161  // All simple function calls (e.g. func()) are implicitly cast to pointer to
162  // function. As a result, we try and obtain the DeclRefExpr from the
163  // ImplicitCastExpr.
164  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
165  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
166    return false;
167  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
168  if (!DRE)
169    return false;
170
171  // We have a DeclRefExpr.
172  if (strcmp(DRE->getDecl()->getName(), "__builtin_classify_type") == 0) {
173    // If no argument was supplied, default to "no_type_class". This isn't
174    // ideal, however it's what gcc does.
175    Result = static_cast<uint64_t>(no_type_class);
176    if (NumArgs >= 1) {
177      QualType argType = getArg(0)->getType();
178
179      if (argType->isVoidType())
180        Result = void_type_class;
181      else if (argType->isEnumeralType())
182        Result = enumeral_type_class;
183      else if (argType->isBooleanType())
184        Result = boolean_type_class;
185      else if (argType->isCharType())
186        Result = string_type_class; // gcc doesn't appear to use char_type_class
187      else if (argType->isIntegerType())
188        Result = integer_type_class;
189      else if (argType->isPointerType())
190        Result = pointer_type_class;
191      else if (argType->isReferenceType())
192        Result = reference_type_class;
193      else if (argType->isRealType())
194        Result = real_type_class;
195      else if (argType->isComplexType())
196        Result = complex_type_class;
197      else if (argType->isFunctionType())
198        Result = function_type_class;
199      else if (argType->isStructureType())
200        Result = record_type_class;
201      else if (argType->isUnionType())
202        Result = union_type_class;
203      else if (argType->isArrayType())
204        Result = array_type_class;
205      else if (argType->isUnionType())
206        Result = union_type_class;
207      else  // FIXME: offset_type_class, method_type_class, & lang_type_class?
208        assert(0 && "CallExpr::isBuiltinClassifyType(): unimplemented type");
209    }
210    return true;
211  }
212  return false;
213}
214
215/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
216/// corresponds to, e.g. "<<=".
217const char *BinaryOperator::getOpcodeStr(Opcode Op) {
218  switch (Op) {
219  default: assert(0 && "Unknown binary operator");
220  case Mul:       return "*";
221  case Div:       return "/";
222  case Rem:       return "%";
223  case Add:       return "+";
224  case Sub:       return "-";
225  case Shl:       return "<<";
226  case Shr:       return ">>";
227  case LT:        return "<";
228  case GT:        return ">";
229  case LE:        return "<=";
230  case GE:        return ">=";
231  case EQ:        return "==";
232  case NE:        return "!=";
233  case And:       return "&";
234  case Xor:       return "^";
235  case Or:        return "|";
236  case LAnd:      return "&&";
237  case LOr:       return "||";
238  case Assign:    return "=";
239  case MulAssign: return "*=";
240  case DivAssign: return "/=";
241  case RemAssign: return "%=";
242  case AddAssign: return "+=";
243  case SubAssign: return "-=";
244  case ShlAssign: return "<<=";
245  case ShrAssign: return ">>=";
246  case AndAssign: return "&=";
247  case XorAssign: return "^=";
248  case OrAssign:  return "|=";
249  case Comma:     return ",";
250  }
251}
252
253InitListExpr::InitListExpr(SourceLocation lbraceloc,
254                           Expr **initexprs, unsigned numinits,
255                           SourceLocation rbraceloc)
256  : Expr(InitListExprClass, QualType()),
257    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc)
258{
259  for (unsigned i = 0; i != numinits; i++)
260    InitExprs.push_back(initexprs[i]);
261}
262
263//===----------------------------------------------------------------------===//
264// Generic Expression Routines
265//===----------------------------------------------------------------------===//
266
267/// hasLocalSideEffect - Return true if this immediate expression has side
268/// effects, not counting any sub-expressions.
269bool Expr::hasLocalSideEffect() const {
270  switch (getStmtClass()) {
271  default:
272    return false;
273  case ParenExprClass:
274    return cast<ParenExpr>(this)->getSubExpr()->hasLocalSideEffect();
275  case UnaryOperatorClass: {
276    const UnaryOperator *UO = cast<UnaryOperator>(this);
277
278    switch (UO->getOpcode()) {
279    default: return false;
280    case UnaryOperator::PostInc:
281    case UnaryOperator::PostDec:
282    case UnaryOperator::PreInc:
283    case UnaryOperator::PreDec:
284      return true;                     // ++/--
285
286    case UnaryOperator::Deref:
287      // Dereferencing a volatile pointer is a side-effect.
288      return getType().isVolatileQualified();
289    case UnaryOperator::Real:
290    case UnaryOperator::Imag:
291      // accessing a piece of a volatile complex is a side-effect.
292      return UO->getSubExpr()->getType().isVolatileQualified();
293
294    case UnaryOperator::Extension:
295      return UO->getSubExpr()->hasLocalSideEffect();
296    }
297  }
298  case BinaryOperatorClass: {
299    const BinaryOperator *BinOp = cast<BinaryOperator>(this);
300    // Consider comma to have side effects if the LHS and RHS both do.
301    if (BinOp->getOpcode() == BinaryOperator::Comma)
302      return BinOp->getLHS()->hasLocalSideEffect() &&
303             BinOp->getRHS()->hasLocalSideEffect();
304
305    return BinOp->isAssignmentOp();
306  }
307  case CompoundAssignOperatorClass:
308    return true;
309
310  case ConditionalOperatorClass: {
311    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
312    return Exp->getCond()->hasLocalSideEffect()
313           || (Exp->getLHS() && Exp->getLHS()->hasLocalSideEffect())
314           || (Exp->getRHS() && Exp->getRHS()->hasLocalSideEffect());
315  }
316
317  case MemberExprClass:
318  case ArraySubscriptExprClass:
319    // If the base pointer or element is to a volatile pointer/field, accessing
320    // if is a side effect.
321    return getType().isVolatileQualified();
322
323  case CallExprClass:
324    // TODO: check attributes for pure/const.   "void foo() { strlen("bar"); }"
325    // should warn.
326    return true;
327  case ObjCMessageExprClass:
328    return true;
329  case StmtExprClass:
330    // TODO: check the inside of the statement expression
331    return true;
332
333  case CastExprClass:
334    // If this is a cast to void, check the operand.  Otherwise, the result of
335    // the cast is unused.
336    if (getType()->isVoidType())
337      return cast<CastExpr>(this)->getSubExpr()->hasLocalSideEffect();
338    return false;
339
340  case ImplicitCastExprClass:
341    // Check the operand, since implicit casts are inserted by Sema
342    return cast<ImplicitCastExpr>(this)->getSubExpr()->hasLocalSideEffect();
343
344  case CXXDefaultArgExprClass:
345    return cast<CXXDefaultArgExpr>(this)->getExpr()->hasLocalSideEffect();
346  }
347}
348
349/// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or an
350/// incomplete type other than void. Nonarray expressions that can be lvalues:
351///  - name, where name must be a variable
352///  - e[i]
353///  - (e), where e must be an lvalue
354///  - e.name, where e must be an lvalue
355///  - e->name
356///  - *e, the type of e cannot be a function type
357///  - string-constant
358///  - (__real__ e) and (__imag__ e) where e is an lvalue  [GNU extension]
359///  - reference type [C++ [expr]]
360///
361Expr::isLvalueResult Expr::isLvalue() const {
362  // first, check the type (C99 6.3.2.1)
363  if (TR->isFunctionType()) // from isObjectType()
364    return LV_NotObjectType;
365
366  // Allow qualified void which is an incomplete type other than void (yuck).
367  if (TR->isVoidType() && !TR.getCanonicalType().getCVRQualifiers())
368    return LV_IncompleteVoidType;
369
370  if (TR->isReferenceType()) // C++ [expr]
371    return LV_Valid;
372
373  // the type looks fine, now check the expression
374  switch (getStmtClass()) {
375  case StringLiteralClass: // C99 6.5.1p4
376    return LV_Valid;
377  case ArraySubscriptExprClass: // C99 6.5.3p4 (e1[e2] == (*((e1)+(e2))))
378    // For vectors, make sure base is an lvalue (i.e. not a function call).
379    if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType())
380      return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue();
381    return LV_Valid;
382  case DeclRefExprClass: // C99 6.5.1p2
383    if (isa<VarDecl>(cast<DeclRefExpr>(this)->getDecl()))
384      return LV_Valid;
385    break;
386  case MemberExprClass: { // C99 6.5.2.3p4
387    const MemberExpr *m = cast<MemberExpr>(this);
388    return m->isArrow() ? LV_Valid : m->getBase()->isLvalue();
389  }
390  case UnaryOperatorClass:
391    if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref)
392      return LV_Valid; // C99 6.5.3p4
393
394    if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Real ||
395        cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Imag)
396      return cast<UnaryOperator>(this)->getSubExpr()->isLvalue();  // GNU.
397    break;
398  case ParenExprClass: // C99 6.5.1p5
399    return cast<ParenExpr>(this)->getSubExpr()->isLvalue();
400  case CompoundLiteralExprClass: // C99 6.5.2.5p5
401    return LV_Valid;
402  case ExtVectorElementExprClass:
403    if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements())
404      return LV_DuplicateVectorComponents;
405    return LV_Valid;
406  case ObjCIvarRefExprClass: // ObjC instance variables are lvalues.
407    return LV_Valid;
408  case PreDefinedExprClass:
409    return LV_Valid;
410  case CXXDefaultArgExprClass:
411    return cast<CXXDefaultArgExpr>(this)->getExpr()->isLvalue();
412  default:
413    break;
414  }
415  return LV_InvalidExpression;
416}
417
418/// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
419/// does not have an incomplete type, does not have a const-qualified type, and
420/// if it is a structure or union, does not have any member (including,
421/// recursively, any member or element of all contained aggregates or unions)
422/// with a const-qualified type.
423Expr::isModifiableLvalueResult Expr::isModifiableLvalue() const {
424  isLvalueResult lvalResult = isLvalue();
425
426  switch (lvalResult) {
427  case LV_Valid: break;
428  case LV_NotObjectType: return MLV_NotObjectType;
429  case LV_IncompleteVoidType: return MLV_IncompleteVoidType;
430  case LV_DuplicateVectorComponents: return MLV_DuplicateVectorComponents;
431  case LV_InvalidExpression: return MLV_InvalidExpression;
432  }
433  if (TR.isConstQualified())
434    return MLV_ConstQualified;
435  if (TR->isArrayType())
436    return MLV_ArrayType;
437  if (TR->isIncompleteType())
438    return MLV_IncompleteType;
439
440  if (const RecordType *r = dyn_cast<RecordType>(TR.getCanonicalType())) {
441    if (r->hasConstFields())
442      return MLV_ConstQualified;
443  }
444  return MLV_Valid;
445}
446
447/// hasGlobalStorage - Return true if this expression has static storage
448/// duration.  This means that the address of this expression is a link-time
449/// constant.
450bool Expr::hasGlobalStorage() const {
451  switch (getStmtClass()) {
452  default:
453    return false;
454  case ParenExprClass:
455    return cast<ParenExpr>(this)->getSubExpr()->hasGlobalStorage();
456  case ImplicitCastExprClass:
457    return cast<ImplicitCastExpr>(this)->getSubExpr()->hasGlobalStorage();
458  case CompoundLiteralExprClass:
459    return cast<CompoundLiteralExpr>(this)->isFileScope();
460  case DeclRefExprClass: {
461    const Decl *D = cast<DeclRefExpr>(this)->getDecl();
462    if (const VarDecl *VD = dyn_cast<VarDecl>(D))
463      return VD->hasGlobalStorage();
464    if (isa<FunctionDecl>(D))
465      return true;
466    return false;
467  }
468  case MemberExprClass: {
469    const MemberExpr *M = cast<MemberExpr>(this);
470    return !M->isArrow() && M->getBase()->hasGlobalStorage();
471  }
472  case ArraySubscriptExprClass:
473    return cast<ArraySubscriptExpr>(this)->getBase()->hasGlobalStorage();
474  case PreDefinedExprClass:
475    return true;
476  case CXXDefaultArgExprClass:
477    return cast<CXXDefaultArgExpr>(this)->getExpr()->hasGlobalStorage();
478  }
479}
480
481Expr* Expr::IgnoreParens() {
482  Expr* E = this;
483  while (ParenExpr* P = dyn_cast<ParenExpr>(E))
484    E = P->getSubExpr();
485
486  return E;
487}
488
489/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
490/// or CastExprs or ImplicitCastExprs, returning their operand.
491Expr *Expr::IgnoreParenCasts() {
492  Expr *E = this;
493  while (true) {
494    if (ParenExpr *P = dyn_cast<ParenExpr>(E))
495      E = P->getSubExpr();
496    else if (CastExpr *P = dyn_cast<CastExpr>(E))
497      E = P->getSubExpr();
498    else if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E))
499      E = P->getSubExpr();
500    else
501      return E;
502  }
503}
504
505
506bool Expr::isConstantExpr(ASTContext &Ctx, SourceLocation *Loc) const {
507  switch (getStmtClass()) {
508  default:
509    if (Loc) *Loc = getLocStart();
510    return false;
511  case ParenExprClass:
512    return cast<ParenExpr>(this)->getSubExpr()->isConstantExpr(Ctx, Loc);
513  case StringLiteralClass:
514  case ObjCStringLiteralClass:
515  case FloatingLiteralClass:
516  case IntegerLiteralClass:
517  case CharacterLiteralClass:
518  case ImaginaryLiteralClass:
519  case TypesCompatibleExprClass:
520  case CXXBoolLiteralExprClass:
521    return true;
522  case CallExprClass: {
523    const CallExpr *CE = cast<CallExpr>(this);
524    if (CE->isBuiltinConstantExpr())
525      return true;
526    if (Loc) *Loc = getLocStart();
527    return false;
528  }
529  case DeclRefExprClass: {
530    const Decl *D = cast<DeclRefExpr>(this)->getDecl();
531    // Accept address of function.
532    if (isa<EnumConstantDecl>(D) || isa<FunctionDecl>(D))
533      return true;
534    if (Loc) *Loc = getLocStart();
535    if (isa<VarDecl>(D))
536      return TR->isArrayType();
537    return false;
538  }
539  case CompoundLiteralExprClass:
540    if (Loc) *Loc = getLocStart();
541    // Allow "(int []){2,4}", since the array will be converted to a pointer.
542    // Allow "(vector type){2,4}" since the elements are all constant.
543    return TR->isArrayType() || TR->isVectorType();
544  case UnaryOperatorClass: {
545    const UnaryOperator *Exp = cast<UnaryOperator>(this);
546
547    // C99 6.6p9
548    if (Exp->getOpcode() == UnaryOperator::AddrOf) {
549      if (!Exp->getSubExpr()->hasGlobalStorage()) {
550        if (Loc) *Loc = getLocStart();
551        return false;
552      }
553      return true;
554    }
555
556    // Get the operand value.  If this is sizeof/alignof, do not evalute the
557    // operand.  This affects C99 6.6p3.
558    if (!Exp->isSizeOfAlignOfOp() &&
559        Exp->getOpcode() != UnaryOperator::OffsetOf &&
560        !Exp->getSubExpr()->isConstantExpr(Ctx, Loc))
561      return false;
562
563    switch (Exp->getOpcode()) {
564    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
565    // See C99 6.6p3.
566    default:
567      if (Loc) *Loc = Exp->getOperatorLoc();
568      return false;
569    case UnaryOperator::Extension:
570      return true;  // FIXME: this is wrong.
571    case UnaryOperator::SizeOf:
572    case UnaryOperator::AlignOf:
573    case UnaryOperator::OffsetOf:
574      // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
575      if (!Exp->getSubExpr()->getType()->isConstantSizeType()) {
576        if (Loc) *Loc = Exp->getOperatorLoc();
577        return false;
578      }
579      return true;
580    case UnaryOperator::LNot:
581    case UnaryOperator::Plus:
582    case UnaryOperator::Minus:
583    case UnaryOperator::Not:
584      return true;
585    }
586  }
587  case SizeOfAlignOfTypeExprClass: {
588    const SizeOfAlignOfTypeExpr *Exp = cast<SizeOfAlignOfTypeExpr>(this);
589    // alignof always evaluates to a constant.
590    if (Exp->isSizeOf() && !Exp->getArgumentType()->isVoidType() &&
591        !Exp->getArgumentType()->isConstantSizeType()) {
592      if (Loc) *Loc = Exp->getOperatorLoc();
593      return false;
594    }
595    return true;
596  }
597  case BinaryOperatorClass: {
598    const BinaryOperator *Exp = cast<BinaryOperator>(this);
599
600    // The LHS of a constant expr is always evaluated and needed.
601    if (!Exp->getLHS()->isConstantExpr(Ctx, Loc))
602      return false;
603
604    if (!Exp->getRHS()->isConstantExpr(Ctx, Loc))
605      return false;
606    return true;
607  }
608  case ImplicitCastExprClass:
609  case CastExprClass: {
610    const Expr *SubExpr;
611    SourceLocation CastLoc;
612    if (const CastExpr *C = dyn_cast<CastExpr>(this)) {
613      SubExpr = C->getSubExpr();
614      CastLoc = C->getLParenLoc();
615    } else {
616      SubExpr = cast<ImplicitCastExpr>(this)->getSubExpr();
617      CastLoc = getLocStart();
618    }
619    if (!SubExpr->isConstantExpr(Ctx, Loc)) {
620      if (Loc) *Loc = SubExpr->getLocStart();
621      return false;
622    }
623    return true;
624  }
625  case ConditionalOperatorClass: {
626    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
627    if (!Exp->getCond()->isConstantExpr(Ctx, Loc) ||
628        // Handle the GNU extension for missing LHS.
629        !(Exp->getLHS() && Exp->getLHS()->isConstantExpr(Ctx, Loc)) ||
630        !Exp->getRHS()->isConstantExpr(Ctx, Loc))
631      return false;
632    return true;
633  }
634  case InitListExprClass: {
635    const InitListExpr *Exp = cast<InitListExpr>(this);
636    unsigned numInits = Exp->getNumInits();
637    for (unsigned i = 0; i < numInits; i++) {
638      if (!Exp->getInit(i)->isConstantExpr(Ctx, Loc)) {
639        if (Loc) *Loc = Exp->getInit(i)->getLocStart();
640        return false;
641      }
642    }
643    return true;
644  }
645  case CXXDefaultArgExprClass:
646    return cast<CXXDefaultArgExpr>(this)->getExpr()->isConstantExpr(Ctx, Loc);
647  }
648}
649
650/// isIntegerConstantExpr - this recursive routine will test if an expression is
651/// an integer constant expression. Note: With the introduction of VLA's in
652/// C99 the result of the sizeof operator is no longer always a constant
653/// expression. The generalization of the wording to include any subexpression
654/// that is not evaluated (C99 6.6p3) means that nonconstant subexpressions
655/// can appear as operands to other operators (e.g. &&, ||, ?:). For instance,
656/// "0 || f()" can be treated as a constant expression. In C90 this expression,
657/// occurring in a context requiring a constant, would have been a constraint
658/// violation. FIXME: This routine currently implements C90 semantics.
659/// To properly implement C99 semantics this routine will need to evaluate
660/// expressions involving operators previously mentioned.
661
662/// FIXME: Pass up a reason why! Invalid operation in i-c-e, division by zero,
663/// comma, etc
664///
665/// FIXME: This should ext-warn on overflow during evaluation!  ISO C does not
666/// permit this.  This includes things like (int)1e1000
667///
668/// FIXME: Handle offsetof.  Two things to do:  Handle GCC's __builtin_offsetof
669/// to support gcc 4.0+  and handle the idiom GCC recognizes with a null pointer
670/// cast+dereference.
671bool Expr::isIntegerConstantExpr(llvm::APSInt &Result, ASTContext &Ctx,
672                                 SourceLocation *Loc, bool isEvaluated) const {
673  switch (getStmtClass()) {
674  default:
675    if (Loc) *Loc = getLocStart();
676    return false;
677  case ParenExprClass:
678    return cast<ParenExpr>(this)->getSubExpr()->
679                     isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated);
680  case IntegerLiteralClass:
681    Result = cast<IntegerLiteral>(this)->getValue();
682    break;
683  case CharacterLiteralClass: {
684    const CharacterLiteral *CL = cast<CharacterLiteral>(this);
685    Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
686    Result = CL->getValue();
687    Result.setIsUnsigned(!getType()->isSignedIntegerType());
688    break;
689  }
690  case TypesCompatibleExprClass: {
691    const TypesCompatibleExpr *TCE = cast<TypesCompatibleExpr>(this);
692    Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
693    Result = Ctx.typesAreCompatible(TCE->getArgType1(), TCE->getArgType2());
694    break;
695  }
696  case CallExprClass: {
697    const CallExpr *CE = cast<CallExpr>(this);
698    Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
699    if (CE->isBuiltinClassifyType(Result))
700      break;
701    if (Loc) *Loc = getLocStart();
702    return false;
703  }
704  case DeclRefExprClass:
705    if (const EnumConstantDecl *D =
706          dyn_cast<EnumConstantDecl>(cast<DeclRefExpr>(this)->getDecl())) {
707      Result = D->getInitVal();
708      break;
709    }
710    if (Loc) *Loc = getLocStart();
711    return false;
712  case UnaryOperatorClass: {
713    const UnaryOperator *Exp = cast<UnaryOperator>(this);
714
715    // Get the operand value.  If this is sizeof/alignof, do not evalute the
716    // operand.  This affects C99 6.6p3.
717    if (!Exp->isSizeOfAlignOfOp() && !Exp->isOffsetOfOp() &&
718        !Exp->getSubExpr()->isIntegerConstantExpr(Result, Ctx, Loc,isEvaluated))
719      return false;
720
721    switch (Exp->getOpcode()) {
722    // Address, indirect, pre/post inc/dec, etc are not valid constant exprs.
723    // See C99 6.6p3.
724    default:
725      if (Loc) *Loc = Exp->getOperatorLoc();
726      return false;
727    case UnaryOperator::Extension:
728      return true;  // FIXME: this is wrong.
729    case UnaryOperator::SizeOf:
730    case UnaryOperator::AlignOf:
731      // Return the result in the right width.
732      Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
733
734      // sizeof(void) and __alignof__(void) = 1 as a gcc extension.
735      if (Exp->getSubExpr()->getType()->isVoidType()) {
736        Result = 1;
737        break;
738      }
739
740      // sizeof(vla) is not a constantexpr: C99 6.5.3.4p2.
741      if (!Exp->getSubExpr()->getType()->isConstantSizeType()) {
742        if (Loc) *Loc = Exp->getOperatorLoc();
743        return false;
744      }
745
746      // Get information about the size or align.
747      if (Exp->getSubExpr()->getType()->isFunctionType()) {
748        // GCC extension: sizeof(function) = 1.
749        Result = Exp->getOpcode() == UnaryOperator::AlignOf ? 4 : 1;
750      } else {
751        unsigned CharSize = Ctx.Target.getCharWidth();
752        if (Exp->getOpcode() == UnaryOperator::AlignOf)
753          Result = Ctx.getTypeAlign(Exp->getSubExpr()->getType()) / CharSize;
754        else
755          Result = Ctx.getTypeSize(Exp->getSubExpr()->getType()) / CharSize;
756      }
757      break;
758    case UnaryOperator::LNot: {
759      bool Val = Result == 0;
760      Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
761      Result = Val;
762      break;
763    }
764    case UnaryOperator::Plus:
765      break;
766    case UnaryOperator::Minus:
767      Result = -Result;
768      break;
769    case UnaryOperator::Not:
770      Result = ~Result;
771      break;
772    case UnaryOperator::OffsetOf:
773      Result = Exp->evaluateOffsetOf(Ctx);
774    }
775    break;
776  }
777  case SizeOfAlignOfTypeExprClass: {
778    const SizeOfAlignOfTypeExpr *Exp = cast<SizeOfAlignOfTypeExpr>(this);
779
780    // Return the result in the right width.
781    Result.zextOrTrunc(static_cast<uint32_t>(Ctx.getTypeSize(getType())));
782
783    // sizeof(void) and __alignof__(void) = 1 as a gcc extension.
784    if (Exp->getArgumentType()->isVoidType()) {
785      Result = 1;
786      break;
787    }
788
789    // alignof always evaluates to a constant, sizeof does if arg is not VLA.
790    if (Exp->isSizeOf() && !Exp->getArgumentType()->isConstantSizeType()) {
791      if (Loc) *Loc = Exp->getOperatorLoc();
792      return false;
793    }
794
795    // Get information about the size or align.
796    if (Exp->getArgumentType()->isFunctionType()) {
797      // GCC extension: sizeof(function) = 1.
798      Result = Exp->isSizeOf() ? 1 : 4;
799    } else {
800      unsigned CharSize = Ctx.Target.getCharWidth();
801      if (Exp->isSizeOf())
802        Result = Ctx.getTypeSize(Exp->getArgumentType()) / CharSize;
803      else
804        Result = Ctx.getTypeAlign(Exp->getArgumentType()) / CharSize;
805    }
806    break;
807  }
808  case BinaryOperatorClass: {
809    const BinaryOperator *Exp = cast<BinaryOperator>(this);
810
811    // The LHS of a constant expr is always evaluated and needed.
812    if (!Exp->getLHS()->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated))
813      return false;
814
815    llvm::APSInt RHS(Result);
816
817    // The short-circuiting &&/|| operators don't necessarily evaluate their
818    // RHS.  Make sure to pass isEvaluated down correctly.
819    if (Exp->isLogicalOp()) {
820      bool RHSEval;
821      if (Exp->getOpcode() == BinaryOperator::LAnd)
822        RHSEval = Result != 0;
823      else {
824        assert(Exp->getOpcode() == BinaryOperator::LOr &&"Unexpected logical");
825        RHSEval = Result == 0;
826      }
827
828      if (!Exp->getRHS()->isIntegerConstantExpr(RHS, Ctx, Loc,
829                                                isEvaluated & RHSEval))
830        return false;
831    } else {
832      if (!Exp->getRHS()->isIntegerConstantExpr(RHS, Ctx, Loc, isEvaluated))
833        return false;
834    }
835
836    switch (Exp->getOpcode()) {
837    default:
838      if (Loc) *Loc = getLocStart();
839      return false;
840    case BinaryOperator::Mul:
841      Result *= RHS;
842      break;
843    case BinaryOperator::Div:
844      if (RHS == 0) {
845        if (!isEvaluated) break;
846        if (Loc) *Loc = getLocStart();
847        return false;
848      }
849      Result /= RHS;
850      break;
851    case BinaryOperator::Rem:
852      if (RHS == 0) {
853        if (!isEvaluated) break;
854        if (Loc) *Loc = getLocStart();
855        return false;
856      }
857      Result %= RHS;
858      break;
859    case BinaryOperator::Add: Result += RHS; break;
860    case BinaryOperator::Sub: Result -= RHS; break;
861    case BinaryOperator::Shl:
862      Result <<=
863        static_cast<uint32_t>(RHS.getLimitedValue(Result.getBitWidth()-1));
864      break;
865    case BinaryOperator::Shr:
866      Result >>=
867        static_cast<uint32_t>(RHS.getLimitedValue(Result.getBitWidth()-1));
868      break;
869    case BinaryOperator::LT:  Result = Result < RHS; break;
870    case BinaryOperator::GT:  Result = Result > RHS; break;
871    case BinaryOperator::LE:  Result = Result <= RHS; break;
872    case BinaryOperator::GE:  Result = Result >= RHS; break;
873    case BinaryOperator::EQ:  Result = Result == RHS; break;
874    case BinaryOperator::NE:  Result = Result != RHS; break;
875    case BinaryOperator::And: Result &= RHS; break;
876    case BinaryOperator::Xor: Result ^= RHS; break;
877    case BinaryOperator::Or:  Result |= RHS; break;
878    case BinaryOperator::LAnd:
879      Result = Result != 0 && RHS != 0;
880      break;
881    case BinaryOperator::LOr:
882      Result = Result != 0 || RHS != 0;
883      break;
884
885    case BinaryOperator::Comma:
886      // C99 6.6p3: "shall not contain assignment, ..., or comma operators,
887      // *except* when they are contained within a subexpression that is not
888      // evaluated".  Note that Assignment can never happen due to constraints
889      // on the LHS subexpr, so we don't need to check it here.
890      if (isEvaluated) {
891        if (Loc) *Loc = getLocStart();
892        return false;
893      }
894
895      // The result of the constant expr is the RHS.
896      Result = RHS;
897      return true;
898    }
899
900    assert(!Exp->isAssignmentOp() && "LHS can't be a constant expr!");
901    break;
902  }
903  case ImplicitCastExprClass:
904  case CastExprClass: {
905    const Expr *SubExpr;
906    SourceLocation CastLoc;
907    if (const CastExpr *C = dyn_cast<CastExpr>(this)) {
908      SubExpr = C->getSubExpr();
909      CastLoc = C->getLParenLoc();
910    } else {
911      SubExpr = cast<ImplicitCastExpr>(this)->getSubExpr();
912      CastLoc = getLocStart();
913    }
914
915    // C99 6.6p6: shall only convert arithmetic types to integer types.
916    if (!SubExpr->getType()->isArithmeticType() ||
917        !getType()->isIntegerType()) {
918      if (Loc) *Loc = SubExpr->getLocStart();
919      return false;
920    }
921
922    uint32_t DestWidth = static_cast<uint32_t>(Ctx.getTypeSize(getType()));
923
924    // Handle simple integer->integer casts.
925    if (SubExpr->getType()->isIntegerType()) {
926      if (!SubExpr->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated))
927        return false;
928
929      // Figure out if this is a truncate, extend or noop cast.
930      // If the input is signed, do a sign extend, noop, or truncate.
931      if (getType()->isBooleanType()) {
932        // Conversion to bool compares against zero.
933        Result = Result != 0;
934        Result.zextOrTrunc(DestWidth);
935      } else if (SubExpr->getType()->isSignedIntegerType())
936        Result.sextOrTrunc(DestWidth);
937      else  // If the input is unsigned, do a zero extend, noop, or truncate.
938        Result.zextOrTrunc(DestWidth);
939      break;
940    }
941
942    // Allow floating constants that are the immediate operands of casts or that
943    // are parenthesized.
944    const Expr *Operand = SubExpr;
945    while (const ParenExpr *PE = dyn_cast<ParenExpr>(Operand))
946      Operand = PE->getSubExpr();
947
948    // If this isn't a floating literal, we can't handle it.
949    const FloatingLiteral *FL = dyn_cast<FloatingLiteral>(Operand);
950    if (!FL) {
951      if (Loc) *Loc = Operand->getLocStart();
952      return false;
953    }
954
955    // If the destination is boolean, compare against zero.
956    if (getType()->isBooleanType()) {
957      Result = !FL->getValue().isZero();
958      Result.zextOrTrunc(DestWidth);
959      break;
960    }
961
962    // Determine whether we are converting to unsigned or signed.
963    bool DestSigned = getType()->isSignedIntegerType();
964
965    // TODO: Warn on overflow, but probably not here: isIntegerConstantExpr can
966    // be called multiple times per AST.
967    uint64_t Space[4];
968    (void)FL->getValue().convertToInteger(Space, DestWidth, DestSigned,
969                                          llvm::APFloat::rmTowardZero);
970    Result = llvm::APInt(DestWidth, 4, Space);
971    break;
972  }
973  case ConditionalOperatorClass: {
974    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
975
976    if (!Exp->getCond()->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated))
977      return false;
978
979    const Expr *TrueExp  = Exp->getLHS();
980    const Expr *FalseExp = Exp->getRHS();
981    if (Result == 0) std::swap(TrueExp, FalseExp);
982
983    // Evaluate the false one first, discard the result.
984    if (FalseExp && !FalseExp->isIntegerConstantExpr(Result, Ctx, Loc, false))
985      return false;
986    // Evalute the true one, capture the result.
987    if (TrueExp &&
988        !TrueExp->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated))
989      return false;
990    break;
991  }
992  case CXXDefaultArgExprClass:
993    return cast<CXXDefaultArgExpr>(this)
994             ->isIntegerConstantExpr(Result, Ctx, Loc, isEvaluated);
995  }
996
997  // Cases that are valid constant exprs fall through to here.
998  Result.setIsUnsigned(getType()->isUnsignedIntegerType());
999  return true;
1000}
1001
1002/// isNullPointerConstant - C99 6.3.2.3p3 -  Return true if this is either an
1003/// integer constant expression with the value zero, or if this is one that is
1004/// cast to void*.
1005bool Expr::isNullPointerConstant(ASTContext &Ctx) const {
1006  // Strip off a cast to void*, if it exists.
1007  if (const CastExpr *CE = dyn_cast<CastExpr>(this)) {
1008    // Check that it is a cast to void*.
1009    if (const PointerType *PT = CE->getType()->getAsPointerType()) {
1010      QualType Pointee = PT->getPointeeType();
1011      if (Pointee.getCVRQualifiers() == 0 &&
1012          Pointee->isVoidType() &&                                 // to void*
1013          CE->getSubExpr()->getType()->isIntegerType())            // from int.
1014        return CE->getSubExpr()->isNullPointerConstant(Ctx);
1015    }
1016  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
1017    // Ignore the ImplicitCastExpr type entirely.
1018    return ICE->getSubExpr()->isNullPointerConstant(Ctx);
1019  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
1020    // Accept ((void*)0) as a null pointer constant, as many other
1021    // implementations do.
1022    return PE->getSubExpr()->isNullPointerConstant(Ctx);
1023  } else if (const CXXDefaultArgExpr *DefaultArg
1024               = dyn_cast<CXXDefaultArgExpr>(this)) {
1025    // See through default argument expressions
1026    return DefaultArg->getExpr()->isNullPointerConstant(Ctx);
1027  }
1028
1029  // This expression must be an integer type.
1030  if (!getType()->isIntegerType())
1031    return false;
1032
1033  // If we have an integer constant expression, we need to *evaluate* it and
1034  // test for the value 0.
1035  llvm::APSInt Val(32);
1036  return isIntegerConstantExpr(Val, Ctx, 0, true) && Val == 0;
1037}
1038
1039unsigned ExtVectorElementExpr::getNumElements() const {
1040  if (const VectorType *VT = getType()->getAsVectorType())
1041    return VT->getNumElements();
1042  return 1;
1043}
1044
1045/// containsDuplicateElements - Return true if any element access is repeated.
1046bool ExtVectorElementExpr::containsDuplicateElements() const {
1047  const char *compStr = Accessor.getName();
1048  unsigned length = strlen(compStr);
1049
1050  for (unsigned i = 0; i < length-1; i++) {
1051    const char *s = compStr+i;
1052    for (const char c = *s++; *s; s++)
1053      if (c == *s)
1054        return true;
1055  }
1056  return false;
1057}
1058
1059/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
1060void ExtVectorElementExpr::getEncodedElementAccess(
1061                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
1062  const char *compStr = Accessor.getName();
1063
1064  bool isHi =   !strcmp(compStr, "hi");
1065  bool isLo =   !strcmp(compStr, "lo");
1066  bool isEven = !strcmp(compStr, "e");
1067  bool isOdd  = !strcmp(compStr, "o");
1068
1069  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
1070    uint64_t Index;
1071
1072    if (isHi)
1073      Index = e + i;
1074    else if (isLo)
1075      Index = i;
1076    else if (isEven)
1077      Index = 2 * i;
1078    else if (isOdd)
1079      Index = 2 * i + 1;
1080    else
1081      Index = ExtVectorType::getAccessorIdx(compStr[i]);
1082
1083    Elts.push_back(Index);
1084  }
1085}
1086
1087// constructor for instance messages.
1088ObjCMessageExpr::ObjCMessageExpr(Expr *receiver, Selector selInfo,
1089                QualType retType, ObjCMethodDecl *mproto,
1090                SourceLocation LBrac, SourceLocation RBrac,
1091                Expr **ArgExprs, unsigned nargs)
1092  : Expr(ObjCMessageExprClass, retType), SelName(selInfo),
1093    MethodProto(mproto) {
1094  NumArgs = nargs;
1095  SubExprs = new Expr*[NumArgs+1];
1096  SubExprs[RECEIVER] = receiver;
1097  if (NumArgs) {
1098    for (unsigned i = 0; i != NumArgs; ++i)
1099      SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]);
1100  }
1101  LBracloc = LBrac;
1102  RBracloc = RBrac;
1103}
1104
1105// constructor for class messages.
1106// FIXME: clsName should be typed to ObjCInterfaceType
1107ObjCMessageExpr::ObjCMessageExpr(IdentifierInfo *clsName, Selector selInfo,
1108                QualType retType, ObjCMethodDecl *mproto,
1109                SourceLocation LBrac, SourceLocation RBrac,
1110                Expr **ArgExprs, unsigned nargs)
1111  : Expr(ObjCMessageExprClass, retType), SelName(selInfo),
1112    MethodProto(mproto) {
1113  NumArgs = nargs;
1114  SubExprs = new Expr*[NumArgs+1];
1115  SubExprs[RECEIVER] = (Expr*) ((uintptr_t) clsName | 0x1);
1116  if (NumArgs) {
1117    for (unsigned i = 0; i != NumArgs; ++i)
1118      SubExprs[i+ARGS_START] = static_cast<Expr *>(ArgExprs[i]);
1119  }
1120  LBracloc = LBrac;
1121  RBracloc = RBrac;
1122}
1123
1124bool ChooseExpr::isConditionTrue(ASTContext &C) const {
1125  llvm::APSInt CondVal(32);
1126  bool IsConst = getCond()->isIntegerConstantExpr(CondVal, C);
1127  assert(IsConst && "Condition of choose expr must be i-c-e"); IsConst=IsConst;
1128  return CondVal != 0;
1129}
1130
1131static int64_t evaluateOffsetOf(ASTContext& C, const Expr *E)
1132{
1133  if (const MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
1134    QualType Ty = ME->getBase()->getType();
1135
1136    RecordDecl *RD = Ty->getAsRecordType()->getDecl();
1137    const ASTRecordLayout &RL = C.getASTRecordLayout(RD);
1138    FieldDecl *FD = ME->getMemberDecl();
1139
1140    // FIXME: This is linear time.
1141    unsigned i = 0, e = 0;
1142    for (i = 0, e = RD->getNumMembers(); i != e; i++) {
1143      if (RD->getMember(i) == FD)
1144        break;
1145    }
1146
1147    return RL.getFieldOffset(i) + evaluateOffsetOf(C, ME->getBase());
1148  } else if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
1149    const Expr *Base = ASE->getBase();
1150    llvm::APSInt Idx(32);
1151    bool ICE = ASE->getIdx()->isIntegerConstantExpr(Idx, C);
1152    assert(ICE && "Array index is not a constant integer!");
1153
1154    int64_t size = C.getTypeSize(ASE->getType());
1155    size *= Idx.getSExtValue();
1156
1157    return size + evaluateOffsetOf(C, Base);
1158  } else if (isa<CompoundLiteralExpr>(E))
1159    return 0;
1160
1161  assert(0 && "Unknown offsetof subexpression!");
1162  return 0;
1163}
1164
1165int64_t UnaryOperator::evaluateOffsetOf(ASTContext& C) const
1166{
1167  assert(Opc == OffsetOf && "Unary operator not offsetof!");
1168
1169  unsigned CharSize = C.Target.getCharWidth();
1170  return ::evaluateOffsetOf(C, Val) / CharSize;
1171}
1172
1173//===----------------------------------------------------------------------===//
1174//  Child Iterators for iterating over subexpressions/substatements
1175//===----------------------------------------------------------------------===//
1176
1177// DeclRefExpr
1178Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
1179Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
1180
1181// ObjCIvarRefExpr
1182Stmt::child_iterator ObjCIvarRefExpr::child_begin() {
1183  return reinterpret_cast<Stmt**>(&Base);
1184}
1185
1186Stmt::child_iterator ObjCIvarRefExpr::child_end() {
1187  return reinterpret_cast<Stmt**>(&Base)+1;
1188}
1189
1190// PreDefinedExpr
1191Stmt::child_iterator PreDefinedExpr::child_begin() { return child_iterator(); }
1192Stmt::child_iterator PreDefinedExpr::child_end() { return child_iterator(); }
1193
1194// IntegerLiteral
1195Stmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); }
1196Stmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); }
1197
1198// CharacterLiteral
1199Stmt::child_iterator CharacterLiteral::child_begin() { return child_iterator(); }
1200Stmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); }
1201
1202// FloatingLiteral
1203Stmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); }
1204Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
1205
1206// ImaginaryLiteral
1207Stmt::child_iterator ImaginaryLiteral::child_begin() {
1208  return reinterpret_cast<Stmt**>(&Val);
1209}
1210Stmt::child_iterator ImaginaryLiteral::child_end() {
1211  return reinterpret_cast<Stmt**>(&Val)+1;
1212}
1213
1214// StringLiteral
1215Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
1216Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
1217
1218// ParenExpr
1219Stmt::child_iterator ParenExpr::child_begin() {
1220  return reinterpret_cast<Stmt**>(&Val);
1221}
1222Stmt::child_iterator ParenExpr::child_end() {
1223  return reinterpret_cast<Stmt**>(&Val)+1;
1224}
1225
1226// UnaryOperator
1227Stmt::child_iterator UnaryOperator::child_begin() {
1228  return reinterpret_cast<Stmt**>(&Val);
1229}
1230Stmt::child_iterator UnaryOperator::child_end() {
1231  return reinterpret_cast<Stmt**>(&Val+1);
1232}
1233
1234// SizeOfAlignOfTypeExpr
1235Stmt::child_iterator SizeOfAlignOfTypeExpr::child_begin() {
1236  // If the type is a VLA type (and not a typedef), the size expression of the
1237  // VLA needs to be treated as an executable expression.
1238  if (VariableArrayType* T = dyn_cast<VariableArrayType>(Ty.getTypePtr()))
1239    return child_iterator(T);
1240  else
1241    return child_iterator();
1242}
1243Stmt::child_iterator SizeOfAlignOfTypeExpr::child_end() {
1244  return child_iterator();
1245}
1246
1247// ArraySubscriptExpr
1248Stmt::child_iterator ArraySubscriptExpr::child_begin() {
1249  return reinterpret_cast<Stmt**>(&SubExprs);
1250}
1251Stmt::child_iterator ArraySubscriptExpr::child_end() {
1252  return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
1253}
1254
1255// CallExpr
1256Stmt::child_iterator CallExpr::child_begin() {
1257  return reinterpret_cast<Stmt**>(&SubExprs[0]);
1258}
1259Stmt::child_iterator CallExpr::child_end() {
1260  return reinterpret_cast<Stmt**>(&SubExprs[NumArgs+ARGS_START]);
1261}
1262
1263// MemberExpr
1264Stmt::child_iterator MemberExpr::child_begin() {
1265  return reinterpret_cast<Stmt**>(&Base);
1266}
1267Stmt::child_iterator MemberExpr::child_end() {
1268  return reinterpret_cast<Stmt**>(&Base)+1;
1269}
1270
1271// ExtVectorElementExpr
1272Stmt::child_iterator ExtVectorElementExpr::child_begin() {
1273  return reinterpret_cast<Stmt**>(&Base);
1274}
1275Stmt::child_iterator ExtVectorElementExpr::child_end() {
1276  return reinterpret_cast<Stmt**>(&Base)+1;
1277}
1278
1279// CompoundLiteralExpr
1280Stmt::child_iterator CompoundLiteralExpr::child_begin() {
1281  return reinterpret_cast<Stmt**>(&Init);
1282}
1283Stmt::child_iterator CompoundLiteralExpr::child_end() {
1284  return reinterpret_cast<Stmt**>(&Init)+1;
1285}
1286
1287// ImplicitCastExpr
1288Stmt::child_iterator ImplicitCastExpr::child_begin() {
1289  return reinterpret_cast<Stmt**>(&Op);
1290}
1291Stmt::child_iterator ImplicitCastExpr::child_end() {
1292  return reinterpret_cast<Stmt**>(&Op)+1;
1293}
1294
1295// CastExpr
1296Stmt::child_iterator CastExpr::child_begin() {
1297  return reinterpret_cast<Stmt**>(&Op);
1298}
1299Stmt::child_iterator CastExpr::child_end() {
1300  return reinterpret_cast<Stmt**>(&Op)+1;
1301}
1302
1303// BinaryOperator
1304Stmt::child_iterator BinaryOperator::child_begin() {
1305  return reinterpret_cast<Stmt**>(&SubExprs);
1306}
1307Stmt::child_iterator BinaryOperator::child_end() {
1308  return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
1309}
1310
1311// ConditionalOperator
1312Stmt::child_iterator ConditionalOperator::child_begin() {
1313  return reinterpret_cast<Stmt**>(&SubExprs);
1314}
1315Stmt::child_iterator ConditionalOperator::child_end() {
1316  return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
1317}
1318
1319// AddrLabelExpr
1320Stmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); }
1321Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
1322
1323// StmtExpr
1324Stmt::child_iterator StmtExpr::child_begin() {
1325  return reinterpret_cast<Stmt**>(&SubStmt);
1326}
1327Stmt::child_iterator StmtExpr::child_end() {
1328  return reinterpret_cast<Stmt**>(&SubStmt)+1;
1329}
1330
1331// TypesCompatibleExpr
1332Stmt::child_iterator TypesCompatibleExpr::child_begin() {
1333  return child_iterator();
1334}
1335
1336Stmt::child_iterator TypesCompatibleExpr::child_end() {
1337  return child_iterator();
1338}
1339
1340// ChooseExpr
1341Stmt::child_iterator ChooseExpr::child_begin() {
1342  return reinterpret_cast<Stmt**>(&SubExprs);
1343}
1344
1345Stmt::child_iterator ChooseExpr::child_end() {
1346  return reinterpret_cast<Stmt**>(&SubExprs)+END_EXPR;
1347}
1348
1349// OverloadExpr
1350Stmt::child_iterator OverloadExpr::child_begin() {
1351  return reinterpret_cast<Stmt**>(&SubExprs[0]);
1352}
1353Stmt::child_iterator OverloadExpr::child_end() {
1354  return reinterpret_cast<Stmt**>(&SubExprs[NumExprs]);
1355}
1356
1357// ShuffleVectorExpr
1358Stmt::child_iterator ShuffleVectorExpr::child_begin() {
1359  return reinterpret_cast<Stmt**>(&SubExprs[0]);
1360}
1361Stmt::child_iterator ShuffleVectorExpr::child_end() {
1362  return reinterpret_cast<Stmt**>(&SubExprs[NumExprs]);
1363}
1364
1365// VAArgExpr
1366Stmt::child_iterator VAArgExpr::child_begin() {
1367  return reinterpret_cast<Stmt**>(&Val);
1368}
1369
1370Stmt::child_iterator VAArgExpr::child_end() {
1371  return reinterpret_cast<Stmt**>(&Val)+1;
1372}
1373
1374// InitListExpr
1375Stmt::child_iterator InitListExpr::child_begin() {
1376  return reinterpret_cast<Stmt**>(InitExprs.size() ?
1377                                  &InitExprs[0] : 0);
1378}
1379Stmt::child_iterator InitListExpr::child_end() {
1380  return reinterpret_cast<Stmt**>(InitExprs.size() ?
1381                                  &InitExprs[0] + InitExprs.size() : 0);
1382}
1383
1384// ObjCStringLiteral
1385Stmt::child_iterator ObjCStringLiteral::child_begin() {
1386  return child_iterator();
1387}
1388Stmt::child_iterator ObjCStringLiteral::child_end() {
1389  return child_iterator();
1390}
1391
1392// ObjCEncodeExpr
1393Stmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); }
1394Stmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); }
1395
1396// ObjCSelectorExpr
1397Stmt::child_iterator ObjCSelectorExpr::child_begin() {
1398  return child_iterator();
1399}
1400Stmt::child_iterator ObjCSelectorExpr::child_end() {
1401  return child_iterator();
1402}
1403
1404// ObjCProtocolExpr
1405Stmt::child_iterator ObjCProtocolExpr::child_begin() {
1406  return child_iterator();
1407}
1408Stmt::child_iterator ObjCProtocolExpr::child_end() {
1409  return child_iterator();
1410}
1411
1412// ObjCMessageExpr
1413Stmt::child_iterator ObjCMessageExpr::child_begin() {
1414  return reinterpret_cast<Stmt**>(&SubExprs[ getReceiver() ? 0 : ARGS_START ]);
1415}
1416Stmt::child_iterator ObjCMessageExpr::child_end() {
1417  return reinterpret_cast<Stmt**>(&SubExprs[getNumArgs()+ARGS_START]);
1418}
1419
1420