Expr.cpp revision aa165f8458b51c546bebff947343e1a36f3594cb
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/ExprCXX.h"
16#include "clang/AST/APValue.h"
17#include "clang/AST/ASTContext.h"
18#include "clang/AST/DeclObjC.h"
19#include "clang/AST/DeclCXX.h"
20#include "clang/AST/DeclTemplate.h"
21#include "clang/AST/RecordLayout.h"
22#include "clang/AST/StmtVisitor.h"
23#include "clang/Lex/LiteralSupport.h"
24#include "clang/Lex/Lexer.h"
25#include "clang/Basic/Builtins.h"
26#include "clang/Basic/SourceManager.h"
27#include "clang/Basic/TargetInfo.h"
28#include "llvm/Support/ErrorHandling.h"
29#include "llvm/Support/raw_ostream.h"
30#include <algorithm>
31using namespace clang;
32
33void Expr::ANCHOR() {} // key function for Expr class.
34
35/// isKnownToHaveBooleanValue - Return true if this is an integer expression
36/// that is known to return 0 or 1.  This happens for _Bool/bool expressions
37/// but also int expressions which are produced by things like comparisons in
38/// C.
39bool Expr::isKnownToHaveBooleanValue() const {
40  // If this value has _Bool type, it is obvious 0/1.
41  if (getType()->isBooleanType()) return true;
42  // If this is a non-scalar-integer type, we don't care enough to try.
43  if (!getType()->isIntegralOrEnumerationType()) return false;
44
45  if (const ParenExpr *PE = dyn_cast<ParenExpr>(this))
46    return PE->getSubExpr()->isKnownToHaveBooleanValue();
47
48  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(this)) {
49    switch (UO->getOpcode()) {
50    case UO_Plus:
51    case UO_Extension:
52      return UO->getSubExpr()->isKnownToHaveBooleanValue();
53    default:
54      return false;
55    }
56  }
57
58  // Only look through implicit casts.  If the user writes
59  // '(int) (a && b)' treat it as an arbitrary int.
60  if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(this))
61    return CE->getSubExpr()->isKnownToHaveBooleanValue();
62
63  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(this)) {
64    switch (BO->getOpcode()) {
65    default: return false;
66    case BO_LT:   // Relational operators.
67    case BO_GT:
68    case BO_LE:
69    case BO_GE:
70    case BO_EQ:   // Equality operators.
71    case BO_NE:
72    case BO_LAnd: // AND operator.
73    case BO_LOr:  // Logical OR operator.
74      return true;
75
76    case BO_And:  // Bitwise AND operator.
77    case BO_Xor:  // Bitwise XOR operator.
78    case BO_Or:   // Bitwise OR operator.
79      // Handle things like (x==2)|(y==12).
80      return BO->getLHS()->isKnownToHaveBooleanValue() &&
81             BO->getRHS()->isKnownToHaveBooleanValue();
82
83    case BO_Comma:
84    case BO_Assign:
85      return BO->getRHS()->isKnownToHaveBooleanValue();
86    }
87  }
88
89  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(this))
90    return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
91           CO->getFalseExpr()->isKnownToHaveBooleanValue();
92
93  return false;
94}
95
96//===----------------------------------------------------------------------===//
97// Primary Expressions.
98//===----------------------------------------------------------------------===//
99
100void ExplicitTemplateArgumentList::initializeFrom(
101                                      const TemplateArgumentListInfo &Info) {
102  LAngleLoc = Info.getLAngleLoc();
103  RAngleLoc = Info.getRAngleLoc();
104  NumTemplateArgs = Info.size();
105
106  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
107  for (unsigned i = 0; i != NumTemplateArgs; ++i)
108    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
109}
110
111void ExplicitTemplateArgumentList::initializeFrom(
112                                   const TemplateArgumentListInfo &Info,
113                                   bool &Dependent,
114                                   bool &ContainsUnexpandedParameterPack) {
115  LAngleLoc = Info.getLAngleLoc();
116  RAngleLoc = Info.getRAngleLoc();
117  NumTemplateArgs = Info.size();
118
119  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
120  for (unsigned i = 0; i != NumTemplateArgs; ++i) {
121    Dependent = Dependent || Info[i].getArgument().isDependent();
122    ContainsUnexpandedParameterPack
123      = ContainsUnexpandedParameterPack ||
124        Info[i].getArgument().containsUnexpandedParameterPack();
125
126    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
127  }
128}
129
130void ExplicitTemplateArgumentList::copyInto(
131                                      TemplateArgumentListInfo &Info) const {
132  Info.setLAngleLoc(LAngleLoc);
133  Info.setRAngleLoc(RAngleLoc);
134  for (unsigned I = 0; I != NumTemplateArgs; ++I)
135    Info.addArgument(getTemplateArgs()[I]);
136}
137
138std::size_t ExplicitTemplateArgumentList::sizeFor(unsigned NumTemplateArgs) {
139  return sizeof(ExplicitTemplateArgumentList) +
140         sizeof(TemplateArgumentLoc) * NumTemplateArgs;
141}
142
143std::size_t ExplicitTemplateArgumentList::sizeFor(
144                                      const TemplateArgumentListInfo &Info) {
145  return sizeFor(Info.size());
146}
147
148void DeclRefExpr::computeDependence() {
149  ExprBits.TypeDependent = false;
150  ExprBits.ValueDependent = false;
151
152  NamedDecl *D = getDecl();
153
154  // (TD) C++ [temp.dep.expr]p3:
155  //   An id-expression is type-dependent if it contains:
156  //
157  // and
158  //
159  // (VD) C++ [temp.dep.constexpr]p2:
160  //  An identifier is value-dependent if it is:
161
162  //  (TD)  - an identifier that was declared with dependent type
163  //  (VD)  - a name declared with a dependent type,
164  if (getType()->isDependentType()) {
165    ExprBits.TypeDependent = true;
166    ExprBits.ValueDependent = true;
167  }
168  //  (TD)  - a conversion-function-id that specifies a dependent type
169  else if (D->getDeclName().getNameKind()
170                               == DeclarationName::CXXConversionFunctionName &&
171           D->getDeclName().getCXXNameType()->isDependentType()) {
172    ExprBits.TypeDependent = true;
173    ExprBits.ValueDependent = true;
174  }
175  //  (TD)  - a template-id that is dependent,
176  else if (hasExplicitTemplateArgs() &&
177           TemplateSpecializationType::anyDependentTemplateArguments(
178                                                       getTemplateArgs(),
179                                                       getNumTemplateArgs())) {
180    ExprBits.TypeDependent = true;
181    ExprBits.ValueDependent = true;
182  }
183  //  (VD)  - the name of a non-type template parameter,
184  else if (isa<NonTypeTemplateParmDecl>(D))
185    ExprBits.ValueDependent = true;
186  //  (VD) - a constant with integral or enumeration type and is
187  //         initialized with an expression that is value-dependent.
188  else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
189    if (Var->getType()->isIntegralOrEnumerationType() &&
190        Var->getType().getCVRQualifiers() == Qualifiers::Const) {
191      if (const Expr *Init = Var->getAnyInitializer())
192        if (Init->isValueDependent())
193          ExprBits.ValueDependent = true;
194    }
195    // (VD) - FIXME: Missing from the standard:
196    //      -  a member function or a static data member of the current
197    //         instantiation
198    else if (Var->isStaticDataMember() &&
199             Var->getDeclContext()->isDependentContext())
200      ExprBits.ValueDependent = true;
201  }
202  // (VD) - FIXME: Missing from the standard:
203  //      -  a member function or a static data member of the current
204  //         instantiation
205  else if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext())
206    ExprBits.ValueDependent = true;
207  //  (TD)  - a nested-name-specifier or a qualified-id that names a
208  //          member of an unknown specialization.
209  //        (handled by DependentScopeDeclRefExpr)
210
211  // Determine whether this expression contains any unexpanded parameter
212  // packs.
213  // Is the declaration a parameter pack?
214  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
215    if (NTTP->isParameterPack())
216      ExprBits.ContainsUnexpandedParameterPack = true;
217  }
218  // FIXME: Variadic templates function parameter packs.
219}
220
221DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
222                         SourceRange QualifierRange,
223                         ValueDecl *D, SourceLocation NameLoc,
224                         const TemplateArgumentListInfo *TemplateArgs,
225                         QualType T, ExprValueKind VK)
226  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
227    DecoratedD(D,
228               (Qualifier? HasQualifierFlag : 0) |
229               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
230    Loc(NameLoc) {
231  if (Qualifier) {
232    NameQualifier *NQ = getNameQualifier();
233    NQ->NNS = Qualifier;
234    NQ->Range = QualifierRange;
235  }
236
237  if (TemplateArgs)
238    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
239
240  computeDependence();
241}
242
243DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
244                         SourceRange QualifierRange,
245                         ValueDecl *D, const DeclarationNameInfo &NameInfo,
246                         const TemplateArgumentListInfo *TemplateArgs,
247                         QualType T, ExprValueKind VK)
248  : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false),
249    DecoratedD(D,
250               (Qualifier? HasQualifierFlag : 0) |
251               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
252    Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
253  if (Qualifier) {
254    NameQualifier *NQ = getNameQualifier();
255    NQ->NNS = Qualifier;
256    NQ->Range = QualifierRange;
257  }
258
259  if (TemplateArgs)
260    getExplicitTemplateArgs().initializeFrom(*TemplateArgs);
261
262  computeDependence();
263}
264
265DeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
266                                 NestedNameSpecifier *Qualifier,
267                                 SourceRange QualifierRange,
268                                 ValueDecl *D,
269                                 SourceLocation NameLoc,
270                                 QualType T,
271                                 ExprValueKind VK,
272                                 const TemplateArgumentListInfo *TemplateArgs) {
273  return Create(Context, Qualifier, QualifierRange, D,
274                DeclarationNameInfo(D->getDeclName(), NameLoc),
275                T, VK, TemplateArgs);
276}
277
278DeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
279                                 NestedNameSpecifier *Qualifier,
280                                 SourceRange QualifierRange,
281                                 ValueDecl *D,
282                                 const DeclarationNameInfo &NameInfo,
283                                 QualType T,
284                                 ExprValueKind VK,
285                                 const TemplateArgumentListInfo *TemplateArgs) {
286  std::size_t Size = sizeof(DeclRefExpr);
287  if (Qualifier != 0)
288    Size += sizeof(NameQualifier);
289
290  if (TemplateArgs)
291    Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
292
293  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
294  return new (Mem) DeclRefExpr(Qualifier, QualifierRange, D, NameInfo,
295                               TemplateArgs, T, VK);
296}
297
298DeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context, bool HasQualifier,
299                                      unsigned NumTemplateArgs) {
300  std::size_t Size = sizeof(DeclRefExpr);
301  if (HasQualifier)
302    Size += sizeof(NameQualifier);
303
304  if (NumTemplateArgs)
305    Size += ExplicitTemplateArgumentList::sizeFor(NumTemplateArgs);
306
307  void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
308  return new (Mem) DeclRefExpr(EmptyShell());
309}
310
311SourceRange DeclRefExpr::getSourceRange() const {
312  SourceRange R = getNameInfo().getSourceRange();
313  if (hasQualifier())
314    R.setBegin(getQualifierRange().getBegin());
315  if (hasExplicitTemplateArgs())
316    R.setEnd(getRAngleLoc());
317  return R;
318}
319
320// FIXME: Maybe this should use DeclPrinter with a special "print predefined
321// expr" policy instead.
322std::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
323  ASTContext &Context = CurrentDecl->getASTContext();
324
325  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
326    if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
327      return FD->getNameAsString();
328
329    llvm::SmallString<256> Name;
330    llvm::raw_svector_ostream Out(Name);
331
332    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
333      if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
334        Out << "virtual ";
335      if (MD->isStatic())
336        Out << "static ";
337    }
338
339    PrintingPolicy Policy(Context.getLangOptions());
340
341    std::string Proto = FD->getQualifiedNameAsString(Policy);
342
343    const FunctionType *AFT = FD->getType()->getAs<FunctionType>();
344    const FunctionProtoType *FT = 0;
345    if (FD->hasWrittenPrototype())
346      FT = dyn_cast<FunctionProtoType>(AFT);
347
348    Proto += "(";
349    if (FT) {
350      llvm::raw_string_ostream POut(Proto);
351      for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
352        if (i) POut << ", ";
353        std::string Param;
354        FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy);
355        POut << Param;
356      }
357
358      if (FT->isVariadic()) {
359        if (FD->getNumParams()) POut << ", ";
360        POut << "...";
361      }
362    }
363    Proto += ")";
364
365    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
366      Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
367      if (ThisQuals.hasConst())
368        Proto += " const";
369      if (ThisQuals.hasVolatile())
370        Proto += " volatile";
371    }
372
373    if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
374      AFT->getResultType().getAsStringInternal(Proto, Policy);
375
376    Out << Proto;
377
378    Out.flush();
379    return Name.str().str();
380  }
381  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
382    llvm::SmallString<256> Name;
383    llvm::raw_svector_ostream Out(Name);
384    Out << (MD->isInstanceMethod() ? '-' : '+');
385    Out << '[';
386
387    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
388    // a null check to avoid a crash.
389    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
390      Out << ID;
391
392    if (const ObjCCategoryImplDecl *CID =
393        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
394      Out << '(' << CID << ')';
395
396    Out <<  ' ';
397    Out << MD->getSelector().getAsString();
398    Out <<  ']';
399
400    Out.flush();
401    return Name.str().str();
402  }
403  if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
404    // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
405    return "top level";
406  }
407  return "";
408}
409
410void APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) {
411  if (hasAllocation())
412    C.Deallocate(pVal);
413
414  BitWidth = Val.getBitWidth();
415  unsigned NumWords = Val.getNumWords();
416  const uint64_t* Words = Val.getRawData();
417  if (NumWords > 1) {
418    pVal = new (C) uint64_t[NumWords];
419    std::copy(Words, Words + NumWords, pVal);
420  } else if (NumWords == 1)
421    VAL = Words[0];
422  else
423    VAL = 0;
424}
425
426IntegerLiteral *
427IntegerLiteral::Create(ASTContext &C, const llvm::APInt &V,
428                       QualType type, SourceLocation l) {
429  return new (C) IntegerLiteral(C, V, type, l);
430}
431
432IntegerLiteral *
433IntegerLiteral::Create(ASTContext &C, EmptyShell Empty) {
434  return new (C) IntegerLiteral(Empty);
435}
436
437FloatingLiteral *
438FloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V,
439                        bool isexact, QualType Type, SourceLocation L) {
440  return new (C) FloatingLiteral(C, V, isexact, Type, L);
441}
442
443FloatingLiteral *
444FloatingLiteral::Create(ASTContext &C, EmptyShell Empty) {
445  return new (C) FloatingLiteral(Empty);
446}
447
448/// getValueAsApproximateDouble - This returns the value as an inaccurate
449/// double.  Note that this may cause loss of precision, but is useful for
450/// debugging dumps, etc.
451double FloatingLiteral::getValueAsApproximateDouble() const {
452  llvm::APFloat V = getValue();
453  bool ignored;
454  V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
455            &ignored);
456  return V.convertToDouble();
457}
458
459StringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
460                                     unsigned ByteLength, bool Wide,
461                                     QualType Ty,
462                                     const SourceLocation *Loc,
463                                     unsigned NumStrs) {
464  // Allocate enough space for the StringLiteral plus an array of locations for
465  // any concatenated string tokens.
466  void *Mem = C.Allocate(sizeof(StringLiteral)+
467                         sizeof(SourceLocation)*(NumStrs-1),
468                         llvm::alignOf<StringLiteral>());
469  StringLiteral *SL = new (Mem) StringLiteral(Ty);
470
471  // OPTIMIZE: could allocate this appended to the StringLiteral.
472  char *AStrData = new (C, 1) char[ByteLength];
473  memcpy(AStrData, StrData, ByteLength);
474  SL->StrData = AStrData;
475  SL->ByteLength = ByteLength;
476  SL->IsWide = Wide;
477  SL->TokLocs[0] = Loc[0];
478  SL->NumConcatenated = NumStrs;
479
480  if (NumStrs != 1)
481    memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
482  return SL;
483}
484
485StringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
486  void *Mem = C.Allocate(sizeof(StringLiteral)+
487                         sizeof(SourceLocation)*(NumStrs-1),
488                         llvm::alignOf<StringLiteral>());
489  StringLiteral *SL = new (Mem) StringLiteral(QualType());
490  SL->StrData = 0;
491  SL->ByteLength = 0;
492  SL->NumConcatenated = NumStrs;
493  return SL;
494}
495
496void StringLiteral::setString(ASTContext &C, llvm::StringRef Str) {
497  char *AStrData = new (C, 1) char[Str.size()];
498  memcpy(AStrData, Str.data(), Str.size());
499  StrData = AStrData;
500  ByteLength = Str.size();
501}
502
503/// getLocationOfByte - Return a source location that points to the specified
504/// byte of this string literal.
505///
506/// Strings are amazingly complex.  They can be formed from multiple tokens and
507/// can have escape sequences in them in addition to the usual trigraph and
508/// escaped newline business.  This routine handles this complexity.
509///
510SourceLocation StringLiteral::
511getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
512                  const LangOptions &Features, const TargetInfo &Target) const {
513  assert(!isWide() && "This doesn't work for wide strings yet");
514
515  // Loop over all of the tokens in this string until we find the one that
516  // contains the byte we're looking for.
517  unsigned TokNo = 0;
518  while (1) {
519    assert(TokNo < getNumConcatenated() && "Invalid byte number!");
520    SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
521
522    // Get the spelling of the string so that we can get the data that makes up
523    // the string literal, not the identifier for the macro it is potentially
524    // expanded through.
525    SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
526
527    // Re-lex the token to get its length and original spelling.
528    std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc);
529    bool Invalid = false;
530    llvm::StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
531    if (Invalid)
532      return StrTokSpellingLoc;
533
534    const char *StrData = Buffer.data()+LocInfo.second;
535
536    // Create a langops struct and enable trigraphs.  This is sufficient for
537    // relexing tokens.
538    LangOptions LangOpts;
539    LangOpts.Trigraphs = true;
540
541    // Create a lexer starting at the beginning of this token.
542    Lexer TheLexer(StrTokSpellingLoc, Features, Buffer.begin(), StrData,
543                   Buffer.end());
544    Token TheTok;
545    TheLexer.LexFromRawLexer(TheTok);
546
547    // Use the StringLiteralParser to compute the length of the string in bytes.
548    StringLiteralParser SLP(&TheTok, 1, SM, Features, Target);
549    unsigned TokNumBytes = SLP.GetStringLength();
550
551    // If the byte is in this token, return the location of the byte.
552    if (ByteNo < TokNumBytes ||
553        (ByteNo == TokNumBytes && TokNo == getNumConcatenated())) {
554      unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
555
556      // Now that we know the offset of the token in the spelling, use the
557      // preprocessor to get the offset in the original source.
558      return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
559    }
560
561    // Move to the next string token.
562    ++TokNo;
563    ByteNo -= TokNumBytes;
564  }
565}
566
567
568
569/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
570/// corresponds to, e.g. "sizeof" or "[pre]++".
571const char *UnaryOperator::getOpcodeStr(Opcode Op) {
572  switch (Op) {
573  default: assert(0 && "Unknown unary operator");
574  case UO_PostInc: return "++";
575  case UO_PostDec: return "--";
576  case UO_PreInc:  return "++";
577  case UO_PreDec:  return "--";
578  case UO_AddrOf:  return "&";
579  case UO_Deref:   return "*";
580  case UO_Plus:    return "+";
581  case UO_Minus:   return "-";
582  case UO_Not:     return "~";
583  case UO_LNot:    return "!";
584  case UO_Real:    return "__real";
585  case UO_Imag:    return "__imag";
586  case UO_Extension: return "__extension__";
587  }
588}
589
590UnaryOperatorKind
591UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
592  switch (OO) {
593  default: assert(false && "No unary operator for overloaded function");
594  case OO_PlusPlus:   return Postfix ? UO_PostInc : UO_PreInc;
595  case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
596  case OO_Amp:        return UO_AddrOf;
597  case OO_Star:       return UO_Deref;
598  case OO_Plus:       return UO_Plus;
599  case OO_Minus:      return UO_Minus;
600  case OO_Tilde:      return UO_Not;
601  case OO_Exclaim:    return UO_LNot;
602  }
603}
604
605OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
606  switch (Opc) {
607  case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
608  case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
609  case UO_AddrOf: return OO_Amp;
610  case UO_Deref: return OO_Star;
611  case UO_Plus: return OO_Plus;
612  case UO_Minus: return OO_Minus;
613  case UO_Not: return OO_Tilde;
614  case UO_LNot: return OO_Exclaim;
615  default: return OO_None;
616  }
617}
618
619
620//===----------------------------------------------------------------------===//
621// Postfix Operators.
622//===----------------------------------------------------------------------===//
623
624CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args,
625                   unsigned numargs, QualType t, ExprValueKind VK,
626                   SourceLocation rparenloc)
627  : Expr(SC, t, VK, OK_Ordinary,
628         fn->isTypeDependent(),
629         fn->isValueDependent(),
630         fn->containsUnexpandedParameterPack()),
631    NumArgs(numargs) {
632
633  SubExprs = new (C) Stmt*[numargs+1];
634  SubExprs[FN] = fn;
635  for (unsigned i = 0; i != numargs; ++i) {
636    if (args[i]->isTypeDependent())
637      ExprBits.TypeDependent = true;
638    if (args[i]->isValueDependent())
639      ExprBits.ValueDependent = true;
640    if (args[i]->containsUnexpandedParameterPack())
641      ExprBits.ContainsUnexpandedParameterPack = true;
642
643    SubExprs[i+ARGS_START] = args[i];
644  }
645
646  RParenLoc = rparenloc;
647}
648
649CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
650                   QualType t, ExprValueKind VK, SourceLocation rparenloc)
651  : Expr(CallExprClass, t, VK, OK_Ordinary,
652         fn->isTypeDependent(),
653         fn->isValueDependent(),
654         fn->containsUnexpandedParameterPack()),
655    NumArgs(numargs) {
656
657  SubExprs = new (C) Stmt*[numargs+1];
658  SubExprs[FN] = fn;
659  for (unsigned i = 0; i != numargs; ++i) {
660    if (args[i]->isTypeDependent())
661      ExprBits.TypeDependent = true;
662    if (args[i]->isValueDependent())
663      ExprBits.ValueDependent = true;
664    if (args[i]->containsUnexpandedParameterPack())
665      ExprBits.ContainsUnexpandedParameterPack = true;
666
667    SubExprs[i+ARGS_START] = args[i];
668  }
669
670  RParenLoc = rparenloc;
671}
672
673CallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
674  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
675  // FIXME: Why do we allocate this?
676  SubExprs = new (C) Stmt*[1];
677}
678
679Decl *CallExpr::getCalleeDecl() {
680  Expr *CEE = getCallee()->IgnoreParenCasts();
681  // If we're calling a dereference, look at the pointer instead.
682  if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
683    if (BO->isPtrMemOp())
684      CEE = BO->getRHS()->IgnoreParenCasts();
685  } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
686    if (UO->getOpcode() == UO_Deref)
687      CEE = UO->getSubExpr()->IgnoreParenCasts();
688  }
689  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
690    return DRE->getDecl();
691  if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
692    return ME->getMemberDecl();
693
694  return 0;
695}
696
697FunctionDecl *CallExpr::getDirectCallee() {
698  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
699}
700
701/// setNumArgs - This changes the number of arguments present in this call.
702/// Any orphaned expressions are deleted by this, and any new operands are set
703/// to null.
704void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
705  // No change, just return.
706  if (NumArgs == getNumArgs()) return;
707
708  // If shrinking # arguments, just delete the extras and forgot them.
709  if (NumArgs < getNumArgs()) {
710    this->NumArgs = NumArgs;
711    return;
712  }
713
714  // Otherwise, we are growing the # arguments.  New an bigger argument array.
715  Stmt **NewSubExprs = new (C) Stmt*[NumArgs+1];
716  // Copy over args.
717  for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i)
718    NewSubExprs[i] = SubExprs[i];
719  // Null out new args.
720  for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i)
721    NewSubExprs[i] = 0;
722
723  if (SubExprs) C.Deallocate(SubExprs);
724  SubExprs = NewSubExprs;
725  this->NumArgs = NumArgs;
726}
727
728/// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
729/// not, return 0.
730unsigned CallExpr::isBuiltinCall(ASTContext &Context) const {
731  // All simple function calls (e.g. func()) are implicitly cast to pointer to
732  // function. As a result, we try and obtain the DeclRefExpr from the
733  // ImplicitCastExpr.
734  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
735  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
736    return 0;
737
738  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
739  if (!DRE)
740    return 0;
741
742  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
743  if (!FDecl)
744    return 0;
745
746  if (!FDecl->getIdentifier())
747    return 0;
748
749  return FDecl->getBuiltinID();
750}
751
752QualType CallExpr::getCallReturnType() const {
753  QualType CalleeType = getCallee()->getType();
754  if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
755    CalleeType = FnTypePtr->getPointeeType();
756  else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
757    CalleeType = BPT->getPointeeType();
758  else if (const MemberPointerType *MPT
759                                      = CalleeType->getAs<MemberPointerType>())
760    CalleeType = MPT->getPointeeType();
761
762  const FunctionType *FnType = CalleeType->getAs<FunctionType>();
763  return FnType->getResultType();
764}
765
766OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
767                                   SourceLocation OperatorLoc,
768                                   TypeSourceInfo *tsi,
769                                   OffsetOfNode* compsPtr, unsigned numComps,
770                                   Expr** exprsPtr, unsigned numExprs,
771                                   SourceLocation RParenLoc) {
772  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
773                         sizeof(OffsetOfNode) * numComps +
774                         sizeof(Expr*) * numExprs);
775
776  return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
777                                exprsPtr, numExprs, RParenLoc);
778}
779
780OffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
781                                        unsigned numComps, unsigned numExprs) {
782  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
783                         sizeof(OffsetOfNode) * numComps +
784                         sizeof(Expr*) * numExprs);
785  return new (Mem) OffsetOfExpr(numComps, numExprs);
786}
787
788OffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
789                           SourceLocation OperatorLoc, TypeSourceInfo *tsi,
790                           OffsetOfNode* compsPtr, unsigned numComps,
791                           Expr** exprsPtr, unsigned numExprs,
792                           SourceLocation RParenLoc)
793  : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
794         /*TypeDependent=*/false,
795         /*ValueDependent=*/tsi->getType()->isDependentType(),
796         tsi->getType()->containsUnexpandedParameterPack()),
797    OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
798    NumComps(numComps), NumExprs(numExprs)
799{
800  for(unsigned i = 0; i < numComps; ++i) {
801    setComponent(i, compsPtr[i]);
802  }
803
804  for(unsigned i = 0; i < numExprs; ++i) {
805    if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent())
806      ExprBits.ValueDependent = true;
807    if (exprsPtr[i]->containsUnexpandedParameterPack())
808      ExprBits.ContainsUnexpandedParameterPack = true;
809
810    setIndexExpr(i, exprsPtr[i]);
811  }
812}
813
814IdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
815  assert(getKind() == Field || getKind() == Identifier);
816  if (getKind() == Field)
817    return getField()->getIdentifier();
818
819  return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
820}
821
822MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
823                               NestedNameSpecifier *qual,
824                               SourceRange qualrange,
825                               ValueDecl *memberdecl,
826                               DeclAccessPair founddecl,
827                               DeclarationNameInfo nameinfo,
828                               const TemplateArgumentListInfo *targs,
829                               QualType ty,
830                               ExprValueKind vk,
831                               ExprObjectKind ok) {
832  std::size_t Size = sizeof(MemberExpr);
833
834  bool hasQualOrFound = (qual != 0 ||
835                         founddecl.getDecl() != memberdecl ||
836                         founddecl.getAccess() != memberdecl->getAccess());
837  if (hasQualOrFound)
838    Size += sizeof(MemberNameQualifier);
839
840  if (targs)
841    Size += ExplicitTemplateArgumentList::sizeFor(*targs);
842
843  void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
844  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
845                                       ty, vk, ok);
846
847  if (hasQualOrFound) {
848    if (qual && qual->isDependent()) {
849      E->setValueDependent(true);
850      E->setTypeDependent(true);
851    }
852    E->HasQualifierOrFoundDecl = true;
853
854    MemberNameQualifier *NQ = E->getMemberQualifier();
855    NQ->NNS = qual;
856    NQ->Range = qualrange;
857    NQ->FoundDecl = founddecl;
858  }
859
860  if (targs) {
861    E->HasExplicitTemplateArgumentList = true;
862    E->getExplicitTemplateArgs().initializeFrom(*targs);
863  }
864
865  return E;
866}
867
868const char *CastExpr::getCastKindName() const {
869  switch (getCastKind()) {
870  case CK_Dependent:
871    return "Dependent";
872  case CK_BitCast:
873    return "BitCast";
874  case CK_LValueBitCast:
875    return "LValueBitCast";
876  case CK_LValueToRValue:
877    return "LValueToRValue";
878  case CK_GetObjCProperty:
879    return "GetObjCProperty";
880  case CK_NoOp:
881    return "NoOp";
882  case CK_BaseToDerived:
883    return "BaseToDerived";
884  case CK_DerivedToBase:
885    return "DerivedToBase";
886  case CK_UncheckedDerivedToBase:
887    return "UncheckedDerivedToBase";
888  case CK_Dynamic:
889    return "Dynamic";
890  case CK_ToUnion:
891    return "ToUnion";
892  case CK_ArrayToPointerDecay:
893    return "ArrayToPointerDecay";
894  case CK_FunctionToPointerDecay:
895    return "FunctionToPointerDecay";
896  case CK_NullToMemberPointer:
897    return "NullToMemberPointer";
898  case CK_NullToPointer:
899    return "NullToPointer";
900  case CK_BaseToDerivedMemberPointer:
901    return "BaseToDerivedMemberPointer";
902  case CK_DerivedToBaseMemberPointer:
903    return "DerivedToBaseMemberPointer";
904  case CK_UserDefinedConversion:
905    return "UserDefinedConversion";
906  case CK_ConstructorConversion:
907    return "ConstructorConversion";
908  case CK_IntegralToPointer:
909    return "IntegralToPointer";
910  case CK_PointerToIntegral:
911    return "PointerToIntegral";
912  case CK_PointerToBoolean:
913    return "PointerToBoolean";
914  case CK_ToVoid:
915    return "ToVoid";
916  case CK_VectorSplat:
917    return "VectorSplat";
918  case CK_IntegralCast:
919    return "IntegralCast";
920  case CK_IntegralToBoolean:
921    return "IntegralToBoolean";
922  case CK_IntegralToFloating:
923    return "IntegralToFloating";
924  case CK_FloatingToIntegral:
925    return "FloatingToIntegral";
926  case CK_FloatingCast:
927    return "FloatingCast";
928  case CK_FloatingToBoolean:
929    return "FloatingToBoolean";
930  case CK_MemberPointerToBoolean:
931    return "MemberPointerToBoolean";
932  case CK_AnyPointerToObjCPointerCast:
933    return "AnyPointerToObjCPointerCast";
934  case CK_AnyPointerToBlockPointerCast:
935    return "AnyPointerToBlockPointerCast";
936  case CK_ObjCObjectLValueCast:
937    return "ObjCObjectLValueCast";
938  case CK_FloatingRealToComplex:
939    return "FloatingRealToComplex";
940  case CK_FloatingComplexToReal:
941    return "FloatingComplexToReal";
942  case CK_FloatingComplexToBoolean:
943    return "FloatingComplexToBoolean";
944  case CK_FloatingComplexCast:
945    return "FloatingComplexCast";
946  case CK_FloatingComplexToIntegralComplex:
947    return "FloatingComplexToIntegralComplex";
948  case CK_IntegralRealToComplex:
949    return "IntegralRealToComplex";
950  case CK_IntegralComplexToReal:
951    return "IntegralComplexToReal";
952  case CK_IntegralComplexToBoolean:
953    return "IntegralComplexToBoolean";
954  case CK_IntegralComplexCast:
955    return "IntegralComplexCast";
956  case CK_IntegralComplexToFloatingComplex:
957    return "IntegralComplexToFloatingComplex";
958  }
959
960  llvm_unreachable("Unhandled cast kind!");
961  return 0;
962}
963
964Expr *CastExpr::getSubExprAsWritten() {
965  Expr *SubExpr = 0;
966  CastExpr *E = this;
967  do {
968    SubExpr = E->getSubExpr();
969
970    // Skip any temporary bindings; they're implicit.
971    if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
972      SubExpr = Binder->getSubExpr();
973
974    // Conversions by constructor and conversion functions have a
975    // subexpression describing the call; strip it off.
976    if (E->getCastKind() == CK_ConstructorConversion)
977      SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
978    else if (E->getCastKind() == CK_UserDefinedConversion)
979      SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
980
981    // If the subexpression we're left with is an implicit cast, look
982    // through that, too.
983  } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
984
985  return SubExpr;
986}
987
988CXXBaseSpecifier **CastExpr::path_buffer() {
989  switch (getStmtClass()) {
990#define ABSTRACT_STMT(x)
991#define CASTEXPR(Type, Base) \
992  case Stmt::Type##Class: \
993    return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
994#define STMT(Type, Base)
995#include "clang/AST/StmtNodes.inc"
996  default:
997    llvm_unreachable("non-cast expressions not possible here");
998    return 0;
999  }
1000}
1001
1002void CastExpr::setCastPath(const CXXCastPath &Path) {
1003  assert(Path.size() == path_size());
1004  memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
1005}
1006
1007ImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T,
1008                                           CastKind Kind, Expr *Operand,
1009                                           const CXXCastPath *BasePath,
1010                                           ExprValueKind VK) {
1011  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1012  void *Buffer =
1013    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1014  ImplicitCastExpr *E =
1015    new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
1016  if (PathSize) E->setCastPath(*BasePath);
1017  return E;
1018}
1019
1020ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C,
1021                                                unsigned PathSize) {
1022  void *Buffer =
1023    C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1024  return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
1025}
1026
1027
1028CStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T,
1029                                       ExprValueKind VK, CastKind K, Expr *Op,
1030                                       const CXXCastPath *BasePath,
1031                                       TypeSourceInfo *WrittenTy,
1032                                       SourceLocation L, SourceLocation R) {
1033  unsigned PathSize = (BasePath ? BasePath->size() : 0);
1034  void *Buffer =
1035    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1036  CStyleCastExpr *E =
1037    new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
1038  if (PathSize) E->setCastPath(*BasePath);
1039  return E;
1040}
1041
1042CStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
1043  void *Buffer =
1044    C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1045  return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
1046}
1047
1048/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
1049/// corresponds to, e.g. "<<=".
1050const char *BinaryOperator::getOpcodeStr(Opcode Op) {
1051  switch (Op) {
1052  case BO_PtrMemD:   return ".*";
1053  case BO_PtrMemI:   return "->*";
1054  case BO_Mul:       return "*";
1055  case BO_Div:       return "/";
1056  case BO_Rem:       return "%";
1057  case BO_Add:       return "+";
1058  case BO_Sub:       return "-";
1059  case BO_Shl:       return "<<";
1060  case BO_Shr:       return ">>";
1061  case BO_LT:        return "<";
1062  case BO_GT:        return ">";
1063  case BO_LE:        return "<=";
1064  case BO_GE:        return ">=";
1065  case BO_EQ:        return "==";
1066  case BO_NE:        return "!=";
1067  case BO_And:       return "&";
1068  case BO_Xor:       return "^";
1069  case BO_Or:        return "|";
1070  case BO_LAnd:      return "&&";
1071  case BO_LOr:       return "||";
1072  case BO_Assign:    return "=";
1073  case BO_MulAssign: return "*=";
1074  case BO_DivAssign: return "/=";
1075  case BO_RemAssign: return "%=";
1076  case BO_AddAssign: return "+=";
1077  case BO_SubAssign: return "-=";
1078  case BO_ShlAssign: return "<<=";
1079  case BO_ShrAssign: return ">>=";
1080  case BO_AndAssign: return "&=";
1081  case BO_XorAssign: return "^=";
1082  case BO_OrAssign:  return "|=";
1083  case BO_Comma:     return ",";
1084  }
1085
1086  return "";
1087}
1088
1089BinaryOperatorKind
1090BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
1091  switch (OO) {
1092  default: assert(false && "Not an overloadable binary operator");
1093  case OO_Plus: return BO_Add;
1094  case OO_Minus: return BO_Sub;
1095  case OO_Star: return BO_Mul;
1096  case OO_Slash: return BO_Div;
1097  case OO_Percent: return BO_Rem;
1098  case OO_Caret: return BO_Xor;
1099  case OO_Amp: return BO_And;
1100  case OO_Pipe: return BO_Or;
1101  case OO_Equal: return BO_Assign;
1102  case OO_Less: return BO_LT;
1103  case OO_Greater: return BO_GT;
1104  case OO_PlusEqual: return BO_AddAssign;
1105  case OO_MinusEqual: return BO_SubAssign;
1106  case OO_StarEqual: return BO_MulAssign;
1107  case OO_SlashEqual: return BO_DivAssign;
1108  case OO_PercentEqual: return BO_RemAssign;
1109  case OO_CaretEqual: return BO_XorAssign;
1110  case OO_AmpEqual: return BO_AndAssign;
1111  case OO_PipeEqual: return BO_OrAssign;
1112  case OO_LessLess: return BO_Shl;
1113  case OO_GreaterGreater: return BO_Shr;
1114  case OO_LessLessEqual: return BO_ShlAssign;
1115  case OO_GreaterGreaterEqual: return BO_ShrAssign;
1116  case OO_EqualEqual: return BO_EQ;
1117  case OO_ExclaimEqual: return BO_NE;
1118  case OO_LessEqual: return BO_LE;
1119  case OO_GreaterEqual: return BO_GE;
1120  case OO_AmpAmp: return BO_LAnd;
1121  case OO_PipePipe: return BO_LOr;
1122  case OO_Comma: return BO_Comma;
1123  case OO_ArrowStar: return BO_PtrMemI;
1124  }
1125}
1126
1127OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
1128  static const OverloadedOperatorKind OverOps[] = {
1129    /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
1130    OO_Star, OO_Slash, OO_Percent,
1131    OO_Plus, OO_Minus,
1132    OO_LessLess, OO_GreaterGreater,
1133    OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
1134    OO_EqualEqual, OO_ExclaimEqual,
1135    OO_Amp,
1136    OO_Caret,
1137    OO_Pipe,
1138    OO_AmpAmp,
1139    OO_PipePipe,
1140    OO_Equal, OO_StarEqual,
1141    OO_SlashEqual, OO_PercentEqual,
1142    OO_PlusEqual, OO_MinusEqual,
1143    OO_LessLessEqual, OO_GreaterGreaterEqual,
1144    OO_AmpEqual, OO_CaretEqual,
1145    OO_PipeEqual,
1146    OO_Comma
1147  };
1148  return OverOps[Opc];
1149}
1150
1151InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
1152                           Expr **initExprs, unsigned numInits,
1153                           SourceLocation rbraceloc)
1154  : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
1155         false),
1156    InitExprs(C, numInits),
1157    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
1158    UnionFieldInit(0), HadArrayRangeDesignator(false)
1159{
1160  for (unsigned I = 0; I != numInits; ++I) {
1161    if (initExprs[I]->isTypeDependent())
1162      ExprBits.TypeDependent = true;
1163    if (initExprs[I]->isValueDependent())
1164      ExprBits.ValueDependent = true;
1165    if (initExprs[I]->containsUnexpandedParameterPack())
1166      ExprBits.ContainsUnexpandedParameterPack = true;
1167  }
1168
1169  InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
1170}
1171
1172void InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
1173  if (NumInits > InitExprs.size())
1174    InitExprs.reserve(C, NumInits);
1175}
1176
1177void InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
1178  InitExprs.resize(C, NumInits, 0);
1179}
1180
1181Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
1182  if (Init >= InitExprs.size()) {
1183    InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
1184    InitExprs.back() = expr;
1185    return 0;
1186  }
1187
1188  Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
1189  InitExprs[Init] = expr;
1190  return Result;
1191}
1192
1193SourceRange InitListExpr::getSourceRange() const {
1194  if (SyntacticForm)
1195    return SyntacticForm->getSourceRange();
1196  SourceLocation Beg = LBraceLoc, End = RBraceLoc;
1197  if (Beg.isInvalid()) {
1198    // Find the first non-null initializer.
1199    for (InitExprsTy::const_iterator I = InitExprs.begin(),
1200                                     E = InitExprs.end();
1201      I != E; ++I) {
1202      if (Stmt *S = *I) {
1203        Beg = S->getLocStart();
1204        break;
1205      }
1206    }
1207  }
1208  if (End.isInvalid()) {
1209    // Find the first non-null initializer from the end.
1210    for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(),
1211                                             E = InitExprs.rend();
1212      I != E; ++I) {
1213      if (Stmt *S = *I) {
1214        End = S->getSourceRange().getEnd();
1215        break;
1216      }
1217    }
1218  }
1219  return SourceRange(Beg, End);
1220}
1221
1222/// getFunctionType - Return the underlying function type for this block.
1223///
1224const FunctionType *BlockExpr::getFunctionType() const {
1225  return getType()->getAs<BlockPointerType>()->
1226                    getPointeeType()->getAs<FunctionType>();
1227}
1228
1229SourceLocation BlockExpr::getCaretLocation() const {
1230  return TheBlock->getCaretLocation();
1231}
1232const Stmt *BlockExpr::getBody() const {
1233  return TheBlock->getBody();
1234}
1235Stmt *BlockExpr::getBody() {
1236  return TheBlock->getBody();
1237}
1238
1239
1240//===----------------------------------------------------------------------===//
1241// Generic Expression Routines
1242//===----------------------------------------------------------------------===//
1243
1244/// isUnusedResultAWarning - Return true if this immediate expression should
1245/// be warned about if the result is unused.  If so, fill in Loc and Ranges
1246/// with location to warn on and the source range[s] to report with the
1247/// warning.
1248bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
1249                                  SourceRange &R2, ASTContext &Ctx) const {
1250  // Don't warn if the expr is type dependent. The type could end up
1251  // instantiating to void.
1252  if (isTypeDependent())
1253    return false;
1254
1255  switch (getStmtClass()) {
1256  default:
1257    if (getType()->isVoidType())
1258      return false;
1259    Loc = getExprLoc();
1260    R1 = getSourceRange();
1261    return true;
1262  case ParenExprClass:
1263    return cast<ParenExpr>(this)->getSubExpr()->
1264      isUnusedResultAWarning(Loc, R1, R2, Ctx);
1265  case UnaryOperatorClass: {
1266    const UnaryOperator *UO = cast<UnaryOperator>(this);
1267
1268    switch (UO->getOpcode()) {
1269    default: break;
1270    case UO_PostInc:
1271    case UO_PostDec:
1272    case UO_PreInc:
1273    case UO_PreDec:                 // ++/--
1274      return false;  // Not a warning.
1275    case UO_Deref:
1276      // Dereferencing a volatile pointer is a side-effect.
1277      if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1278        return false;
1279      break;
1280    case UO_Real:
1281    case UO_Imag:
1282      // accessing a piece of a volatile complex is a side-effect.
1283      if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
1284          .isVolatileQualified())
1285        return false;
1286      break;
1287    case UO_Extension:
1288      return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1289    }
1290    Loc = UO->getOperatorLoc();
1291    R1 = UO->getSubExpr()->getSourceRange();
1292    return true;
1293  }
1294  case BinaryOperatorClass: {
1295    const BinaryOperator *BO = cast<BinaryOperator>(this);
1296    switch (BO->getOpcode()) {
1297      default:
1298        break;
1299      // Consider the RHS of comma for side effects. LHS was checked by
1300      // Sema::CheckCommaOperands.
1301      case BO_Comma:
1302        // ((foo = <blah>), 0) is an idiom for hiding the result (and
1303        // lvalue-ness) of an assignment written in a macro.
1304        if (IntegerLiteral *IE =
1305              dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
1306          if (IE->getValue() == 0)
1307            return false;
1308        return BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1309      // Consider '||', '&&' to have side effects if the LHS or RHS does.
1310      case BO_LAnd:
1311      case BO_LOr:
1312        if (!BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
1313            !BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1314          return false;
1315        break;
1316    }
1317    if (BO->isAssignmentOp())
1318      return false;
1319    Loc = BO->getOperatorLoc();
1320    R1 = BO->getLHS()->getSourceRange();
1321    R2 = BO->getRHS()->getSourceRange();
1322    return true;
1323  }
1324  case CompoundAssignOperatorClass:
1325  case VAArgExprClass:
1326    return false;
1327
1328  case ConditionalOperatorClass: {
1329    // The condition must be evaluated, but if either the LHS or RHS is a
1330    // warning, warn about them.
1331    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
1332    if (Exp->getLHS() &&
1333        Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
1334      return true;
1335    return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1336  }
1337
1338  case MemberExprClass:
1339    // If the base pointer or element is to a volatile pointer/field, accessing
1340    // it is a side effect.
1341    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1342      return false;
1343    Loc = cast<MemberExpr>(this)->getMemberLoc();
1344    R1 = SourceRange(Loc, Loc);
1345    R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1346    return true;
1347
1348  case ArraySubscriptExprClass:
1349    // If the base pointer or element is to a volatile pointer/field, accessing
1350    // it is a side effect.
1351    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1352      return false;
1353    Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1354    R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1355    R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1356    return true;
1357
1358  case CallExprClass:
1359  case CXXOperatorCallExprClass:
1360  case CXXMemberCallExprClass: {
1361    // If this is a direct call, get the callee.
1362    const CallExpr *CE = cast<CallExpr>(this);
1363    if (const Decl *FD = CE->getCalleeDecl()) {
1364      // If the callee has attribute pure, const, or warn_unused_result, warn
1365      // about it. void foo() { strlen("bar"); } should warn.
1366      //
1367      // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1368      // updated to match for QoI.
1369      if (FD->getAttr<WarnUnusedResultAttr>() ||
1370          FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1371        Loc = CE->getCallee()->getLocStart();
1372        R1 = CE->getCallee()->getSourceRange();
1373
1374        if (unsigned NumArgs = CE->getNumArgs())
1375          R2 = SourceRange(CE->getArg(0)->getLocStart(),
1376                           CE->getArg(NumArgs-1)->getLocEnd());
1377        return true;
1378      }
1379    }
1380    return false;
1381  }
1382
1383  case CXXTemporaryObjectExprClass:
1384  case CXXConstructExprClass:
1385    return false;
1386
1387  case ObjCMessageExprClass: {
1388    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1389    const ObjCMethodDecl *MD = ME->getMethodDecl();
1390    if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1391      Loc = getExprLoc();
1392      return true;
1393    }
1394    return false;
1395  }
1396
1397  case ObjCPropertyRefExprClass:
1398    Loc = getExprLoc();
1399    R1 = getSourceRange();
1400    return true;
1401
1402  case StmtExprClass: {
1403    // Statement exprs don't logically have side effects themselves, but are
1404    // sometimes used in macros in ways that give them a type that is unused.
1405    // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1406    // however, if the result of the stmt expr is dead, we don't want to emit a
1407    // warning.
1408    const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1409    if (!CS->body_empty()) {
1410      if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1411        return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1412      if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
1413        if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
1414          return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1415    }
1416
1417    if (getType()->isVoidType())
1418      return false;
1419    Loc = cast<StmtExpr>(this)->getLParenLoc();
1420    R1 = getSourceRange();
1421    return true;
1422  }
1423  case CStyleCastExprClass:
1424    // If this is an explicit cast to void, allow it.  People do this when they
1425    // think they know what they're doing :).
1426    if (getType()->isVoidType())
1427      return false;
1428    Loc = cast<CStyleCastExpr>(this)->getLParenLoc();
1429    R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
1430    return true;
1431  case CXXFunctionalCastExprClass: {
1432    if (getType()->isVoidType())
1433      return false;
1434    const CastExpr *CE = cast<CastExpr>(this);
1435
1436    // If this is a cast to void or a constructor conversion, check the operand.
1437    // Otherwise, the result of the cast is unused.
1438    if (CE->getCastKind() == CK_ToVoid ||
1439        CE->getCastKind() == CK_ConstructorConversion)
1440      return (cast<CastExpr>(this)->getSubExpr()
1441              ->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1442    Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc();
1443    R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange();
1444    return true;
1445  }
1446
1447  case ImplicitCastExprClass:
1448    // Check the operand, since implicit casts are inserted by Sema
1449    return (cast<ImplicitCastExpr>(this)
1450            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1451
1452  case CXXDefaultArgExprClass:
1453    return (cast<CXXDefaultArgExpr>(this)
1454            ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1455
1456  case CXXNewExprClass:
1457    // FIXME: In theory, there might be new expressions that don't have side
1458    // effects (e.g. a placement new with an uninitialized POD).
1459  case CXXDeleteExprClass:
1460    return false;
1461  case CXXBindTemporaryExprClass:
1462    return (cast<CXXBindTemporaryExpr>(this)
1463            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1464  case ExprWithCleanupsClass:
1465    return (cast<ExprWithCleanups>(this)
1466            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1467  }
1468}
1469
1470/// isOBJCGCCandidate - Check if an expression is objc gc'able.
1471/// returns true, if it is; false otherwise.
1472bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
1473  switch (getStmtClass()) {
1474  default:
1475    return false;
1476  case ObjCIvarRefExprClass:
1477    return true;
1478  case Expr::UnaryOperatorClass:
1479    return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1480  case ParenExprClass:
1481    return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1482  case ImplicitCastExprClass:
1483    return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1484  case CStyleCastExprClass:
1485    return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1486  case DeclRefExprClass: {
1487    const Decl *D = cast<DeclRefExpr>(this)->getDecl();
1488    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1489      if (VD->hasGlobalStorage())
1490        return true;
1491      QualType T = VD->getType();
1492      // dereferencing to a  pointer is always a gc'able candidate,
1493      // unless it is __weak.
1494      return T->isPointerType() &&
1495             (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1496    }
1497    return false;
1498  }
1499  case MemberExprClass: {
1500    const MemberExpr *M = cast<MemberExpr>(this);
1501    return M->getBase()->isOBJCGCCandidate(Ctx);
1502  }
1503  case ArraySubscriptExprClass:
1504    return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx);
1505  }
1506}
1507
1508bool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
1509  if (isTypeDependent())
1510    return false;
1511  return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
1512}
1513
1514static Expr::CanThrowResult MergeCanThrow(Expr::CanThrowResult CT1,
1515                                          Expr::CanThrowResult CT2) {
1516  // CanThrowResult constants are ordered so that the maximum is the correct
1517  // merge result.
1518  return CT1 > CT2 ? CT1 : CT2;
1519}
1520
1521static Expr::CanThrowResult CanSubExprsThrow(ASTContext &C, const Expr *CE) {
1522  Expr *E = const_cast<Expr*>(CE);
1523  Expr::CanThrowResult R = Expr::CT_Cannot;
1524  for (Expr::child_iterator I = E->child_begin(), IE = E->child_end();
1525       I != IE && R != Expr::CT_Can; ++I) {
1526    R = MergeCanThrow(R, cast<Expr>(*I)->CanThrow(C));
1527  }
1528  return R;
1529}
1530
1531static Expr::CanThrowResult CanCalleeThrow(const Decl *D,
1532                                           bool NullThrows = true) {
1533  if (!D)
1534    return NullThrows ? Expr::CT_Can : Expr::CT_Cannot;
1535
1536  // See if we can get a function type from the decl somehow.
1537  const ValueDecl *VD = dyn_cast<ValueDecl>(D);
1538  if (!VD) // If we have no clue what we're calling, assume the worst.
1539    return Expr::CT_Can;
1540
1541  // As an extension, we assume that __attribute__((nothrow)) functions don't
1542  // throw.
1543  if (isa<FunctionDecl>(D) && D->hasAttr<NoThrowAttr>())
1544    return Expr::CT_Cannot;
1545
1546  QualType T = VD->getType();
1547  const FunctionProtoType *FT;
1548  if ((FT = T->getAs<FunctionProtoType>())) {
1549  } else if (const PointerType *PT = T->getAs<PointerType>())
1550    FT = PT->getPointeeType()->getAs<FunctionProtoType>();
1551  else if (const ReferenceType *RT = T->getAs<ReferenceType>())
1552    FT = RT->getPointeeType()->getAs<FunctionProtoType>();
1553  else if (const MemberPointerType *MT = T->getAs<MemberPointerType>())
1554    FT = MT->getPointeeType()->getAs<FunctionProtoType>();
1555  else if (const BlockPointerType *BT = T->getAs<BlockPointerType>())
1556    FT = BT->getPointeeType()->getAs<FunctionProtoType>();
1557
1558  if (!FT)
1559    return Expr::CT_Can;
1560
1561  return FT->hasEmptyExceptionSpec() ? Expr::CT_Cannot : Expr::CT_Can;
1562}
1563
1564static Expr::CanThrowResult CanDynamicCastThrow(const CXXDynamicCastExpr *DC) {
1565  if (DC->isTypeDependent())
1566    return Expr::CT_Dependent;
1567
1568  if (!DC->getTypeAsWritten()->isReferenceType())
1569    return Expr::CT_Cannot;
1570
1571  return DC->getCastKind() == clang::CK_Dynamic? Expr::CT_Can : Expr::CT_Cannot;
1572}
1573
1574static Expr::CanThrowResult CanTypeidThrow(ASTContext &C,
1575                                           const CXXTypeidExpr *DC) {
1576  if (DC->isTypeOperand())
1577    return Expr::CT_Cannot;
1578
1579  Expr *Op = DC->getExprOperand();
1580  if (Op->isTypeDependent())
1581    return Expr::CT_Dependent;
1582
1583  const RecordType *RT = Op->getType()->getAs<RecordType>();
1584  if (!RT)
1585    return Expr::CT_Cannot;
1586
1587  if (!cast<CXXRecordDecl>(RT->getDecl())->isPolymorphic())
1588    return Expr::CT_Cannot;
1589
1590  if (Op->Classify(C).isPRValue())
1591    return Expr::CT_Cannot;
1592
1593  return Expr::CT_Can;
1594}
1595
1596Expr::CanThrowResult Expr::CanThrow(ASTContext &C) const {
1597  // C++ [expr.unary.noexcept]p3:
1598  //   [Can throw] if in a potentially-evaluated context the expression would
1599  //   contain:
1600  switch (getStmtClass()) {
1601  case CXXThrowExprClass:
1602    //   - a potentially evaluated throw-expression
1603    return CT_Can;
1604
1605  case CXXDynamicCastExprClass: {
1606    //   - a potentially evaluated dynamic_cast expression dynamic_cast<T>(v),
1607    //     where T is a reference type, that requires a run-time check
1608    CanThrowResult CT = CanDynamicCastThrow(cast<CXXDynamicCastExpr>(this));
1609    if (CT == CT_Can)
1610      return CT;
1611    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1612  }
1613
1614  case CXXTypeidExprClass:
1615    //   - a potentially evaluated typeid expression applied to a glvalue
1616    //     expression whose type is a polymorphic class type
1617    return CanTypeidThrow(C, cast<CXXTypeidExpr>(this));
1618
1619    //   - a potentially evaluated call to a function, member function, function
1620    //     pointer, or member function pointer that does not have a non-throwing
1621    //     exception-specification
1622  case CallExprClass:
1623  case CXXOperatorCallExprClass:
1624  case CXXMemberCallExprClass: {
1625    CanThrowResult CT = CanCalleeThrow(cast<CallExpr>(this)->getCalleeDecl());
1626    if (CT == CT_Can)
1627      return CT;
1628    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1629  }
1630
1631  case CXXConstructExprClass:
1632  case CXXTemporaryObjectExprClass: {
1633    CanThrowResult CT = CanCalleeThrow(
1634        cast<CXXConstructExpr>(this)->getConstructor());
1635    if (CT == CT_Can)
1636      return CT;
1637    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1638  }
1639
1640  case CXXNewExprClass: {
1641    CanThrowResult CT = MergeCanThrow(
1642        CanCalleeThrow(cast<CXXNewExpr>(this)->getOperatorNew()),
1643        CanCalleeThrow(cast<CXXNewExpr>(this)->getConstructor(),
1644                       /*NullThrows*/false));
1645    if (CT == CT_Can)
1646      return CT;
1647    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1648  }
1649
1650  case CXXDeleteExprClass: {
1651    CanThrowResult CT = CanCalleeThrow(
1652        cast<CXXDeleteExpr>(this)->getOperatorDelete());
1653    if (CT == CT_Can)
1654      return CT;
1655    const Expr *Arg = cast<CXXDeleteExpr>(this)->getArgument();
1656    // Unwrap exactly one implicit cast, which converts all pointers to void*.
1657    if (const ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(Arg))
1658      Arg = Cast->getSubExpr();
1659    if (const PointerType *PT = Arg->getType()->getAs<PointerType>()) {
1660      if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) {
1661        CanThrowResult CT2 = CanCalleeThrow(
1662            cast<CXXRecordDecl>(RT->getDecl())->getDestructor());
1663        if (CT2 == CT_Can)
1664          return CT2;
1665        CT = MergeCanThrow(CT, CT2);
1666      }
1667    }
1668    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1669  }
1670
1671  case CXXBindTemporaryExprClass: {
1672    // The bound temporary has to be destroyed again, which might throw.
1673    CanThrowResult CT = CanCalleeThrow(
1674      cast<CXXBindTemporaryExpr>(this)->getTemporary()->getDestructor());
1675    if (CT == CT_Can)
1676      return CT;
1677    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1678  }
1679
1680    // ObjC message sends are like function calls, but never have exception
1681    // specs.
1682  case ObjCMessageExprClass:
1683  case ObjCPropertyRefExprClass:
1684    return CT_Can;
1685
1686    // Many other things have subexpressions, so we have to test those.
1687    // Some are simple:
1688  case ParenExprClass:
1689  case MemberExprClass:
1690  case CXXReinterpretCastExprClass:
1691  case CXXConstCastExprClass:
1692  case ConditionalOperatorClass:
1693  case CompoundLiteralExprClass:
1694  case ExtVectorElementExprClass:
1695  case InitListExprClass:
1696  case DesignatedInitExprClass:
1697  case ParenListExprClass:
1698  case VAArgExprClass:
1699  case CXXDefaultArgExprClass:
1700  case ExprWithCleanupsClass:
1701  case ObjCIvarRefExprClass:
1702  case ObjCIsaExprClass:
1703  case ShuffleVectorExprClass:
1704    return CanSubExprsThrow(C, this);
1705
1706    // Some might be dependent for other reasons.
1707  case UnaryOperatorClass:
1708  case ArraySubscriptExprClass:
1709  case ImplicitCastExprClass:
1710  case CStyleCastExprClass:
1711  case CXXStaticCastExprClass:
1712  case CXXFunctionalCastExprClass:
1713  case BinaryOperatorClass:
1714  case CompoundAssignOperatorClass: {
1715    CanThrowResult CT = isTypeDependent() ? CT_Dependent : CT_Cannot;
1716    return MergeCanThrow(CT, CanSubExprsThrow(C, this));
1717  }
1718
1719    // FIXME: We should handle StmtExpr, but that opens a MASSIVE can of worms.
1720  case StmtExprClass:
1721    return CT_Can;
1722
1723  case ChooseExprClass:
1724    if (isTypeDependent() || isValueDependent())
1725      return CT_Dependent;
1726    return cast<ChooseExpr>(this)->getChosenSubExpr(C)->CanThrow(C);
1727
1728    // Some expressions are always dependent.
1729  case DependentScopeDeclRefExprClass:
1730  case CXXUnresolvedConstructExprClass:
1731  case CXXDependentScopeMemberExprClass:
1732    return CT_Dependent;
1733
1734  default:
1735    // All other expressions don't have subexpressions, or else they are
1736    // unevaluated.
1737    return CT_Cannot;
1738  }
1739}
1740
1741Expr* Expr::IgnoreParens() {
1742  Expr* E = this;
1743  while (true) {
1744    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1745      E = P->getSubExpr();
1746      continue;
1747    }
1748    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1749      if (P->getOpcode() == UO_Extension) {
1750        E = P->getSubExpr();
1751        continue;
1752      }
1753    }
1754    return E;
1755  }
1756}
1757
1758/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
1759/// or CastExprs or ImplicitCastExprs, returning their operand.
1760Expr *Expr::IgnoreParenCasts() {
1761  Expr *E = this;
1762  while (true) {
1763    if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
1764      E = P->getSubExpr();
1765      continue;
1766    }
1767    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1768      E = P->getSubExpr();
1769      continue;
1770    }
1771    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1772      if (P->getOpcode() == UO_Extension) {
1773        E = P->getSubExpr();
1774        continue;
1775      }
1776    }
1777    return E;
1778  }
1779}
1780
1781/// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue
1782/// casts.  This is intended purely as a temporary workaround for code
1783/// that hasn't yet been rewritten to do the right thing about those
1784/// casts, and may disappear along with the last internal use.
1785Expr *Expr::IgnoreParenLValueCasts() {
1786  Expr *E = this;
1787  while (true) {
1788    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1789      E = P->getSubExpr();
1790      continue;
1791    } else if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1792      if (P->getCastKind() == CK_LValueToRValue) {
1793        E = P->getSubExpr();
1794        continue;
1795      }
1796    } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1797      if (P->getOpcode() == UO_Extension) {
1798        E = P->getSubExpr();
1799        continue;
1800      }
1801    }
1802    break;
1803  }
1804  return E;
1805}
1806
1807Expr *Expr::IgnoreParenImpCasts() {
1808  Expr *E = this;
1809  while (true) {
1810    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1811      E = P->getSubExpr();
1812      continue;
1813    }
1814    if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) {
1815      E = P->getSubExpr();
1816      continue;
1817    }
1818    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1819      if (P->getOpcode() == UO_Extension) {
1820        E = P->getSubExpr();
1821        continue;
1822      }
1823    }
1824    return E;
1825  }
1826}
1827
1828/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
1829/// value (including ptr->int casts of the same size).  Strip off any
1830/// ParenExpr or CastExprs, returning their operand.
1831Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
1832  Expr *E = this;
1833  while (true) {
1834    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1835      E = P->getSubExpr();
1836      continue;
1837    }
1838
1839    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1840      // We ignore integer <-> casts that are of the same width, ptr<->ptr and
1841      // ptr<->int casts of the same width.  We also ignore all identity casts.
1842      Expr *SE = P->getSubExpr();
1843
1844      if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
1845        E = SE;
1846        continue;
1847      }
1848
1849      if ((E->getType()->isPointerType() ||
1850           E->getType()->isIntegralType(Ctx)) &&
1851          (SE->getType()->isPointerType() ||
1852           SE->getType()->isIntegralType(Ctx)) &&
1853          Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
1854        E = SE;
1855        continue;
1856      }
1857    }
1858
1859    if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
1860      if (P->getOpcode() == UO_Extension) {
1861        E = P->getSubExpr();
1862        continue;
1863      }
1864    }
1865
1866    return E;
1867  }
1868}
1869
1870bool Expr::isDefaultArgument() const {
1871  const Expr *E = this;
1872  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
1873    E = ICE->getSubExprAsWritten();
1874
1875  return isa<CXXDefaultArgExpr>(E);
1876}
1877
1878/// \brief Skip over any no-op casts and any temporary-binding
1879/// expressions.
1880static const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
1881  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1882    if (ICE->getCastKind() == CK_NoOp)
1883      E = ICE->getSubExpr();
1884    else
1885      break;
1886  }
1887
1888  while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
1889    E = BE->getSubExpr();
1890
1891  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1892    if (ICE->getCastKind() == CK_NoOp)
1893      E = ICE->getSubExpr();
1894    else
1895      break;
1896  }
1897
1898  return E->IgnoreParens();
1899}
1900
1901/// isTemporaryObject - Determines if this expression produces a
1902/// temporary of the given class type.
1903bool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
1904  if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
1905    return false;
1906
1907  const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
1908
1909  // Temporaries are by definition pr-values of class type.
1910  if (!E->Classify(C).isPRValue()) {
1911    // In this context, property reference is a message call and is pr-value.
1912    if (!isa<ObjCPropertyRefExpr>(E))
1913      return false;
1914  }
1915
1916  // Black-list a few cases which yield pr-values of class type that don't
1917  // refer to temporaries of that type:
1918
1919  // - implicit derived-to-base conversions
1920  if (isa<ImplicitCastExpr>(E)) {
1921    switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
1922    case CK_DerivedToBase:
1923    case CK_UncheckedDerivedToBase:
1924      return false;
1925    default:
1926      break;
1927    }
1928  }
1929
1930  // - member expressions (all)
1931  if (isa<MemberExpr>(E))
1932    return false;
1933
1934  return true;
1935}
1936
1937/// hasAnyTypeDependentArguments - Determines if any of the expressions
1938/// in Exprs is type-dependent.
1939bool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) {
1940  for (unsigned I = 0; I < NumExprs; ++I)
1941    if (Exprs[I]->isTypeDependent())
1942      return true;
1943
1944  return false;
1945}
1946
1947/// hasAnyValueDependentArguments - Determines if any of the expressions
1948/// in Exprs is value-dependent.
1949bool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
1950  for (unsigned I = 0; I < NumExprs; ++I)
1951    if (Exprs[I]->isValueDependent())
1952      return true;
1953
1954  return false;
1955}
1956
1957bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
1958  // This function is attempting whether an expression is an initializer
1959  // which can be evaluated at compile-time.  isEvaluatable handles most
1960  // of the cases, but it can't deal with some initializer-specific
1961  // expressions, and it can't deal with aggregates; we deal with those here,
1962  // and fall back to isEvaluatable for the other cases.
1963
1964  // If we ever capture reference-binding directly in the AST, we can
1965  // kill the second parameter.
1966
1967  if (IsForRef) {
1968    EvalResult Result;
1969    return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects;
1970  }
1971
1972  switch (getStmtClass()) {
1973  default: break;
1974  case StringLiteralClass:
1975  case ObjCStringLiteralClass:
1976  case ObjCEncodeExprClass:
1977    return true;
1978  case CXXTemporaryObjectExprClass:
1979  case CXXConstructExprClass: {
1980    const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
1981
1982    // Only if it's
1983    // 1) an application of the trivial default constructor or
1984    if (!CE->getConstructor()->isTrivial()) return false;
1985    if (!CE->getNumArgs()) return true;
1986
1987    // 2) an elidable trivial copy construction of an operand which is
1988    //    itself a constant initializer.  Note that we consider the
1989    //    operand on its own, *not* as a reference binding.
1990    return CE->isElidable() &&
1991           CE->getArg(0)->isConstantInitializer(Ctx, false);
1992  }
1993  case CompoundLiteralExprClass: {
1994    // This handles gcc's extension that allows global initializers like
1995    // "struct x {int x;} x = (struct x) {};".
1996    // FIXME: This accepts other cases it shouldn't!
1997    const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
1998    return Exp->isConstantInitializer(Ctx, false);
1999  }
2000  case InitListExprClass: {
2001    // FIXME: This doesn't deal with fields with reference types correctly.
2002    // FIXME: This incorrectly allows pointers cast to integers to be assigned
2003    // to bitfields.
2004    const InitListExpr *Exp = cast<InitListExpr>(this);
2005    unsigned numInits = Exp->getNumInits();
2006    for (unsigned i = 0; i < numInits; i++) {
2007      if (!Exp->getInit(i)->isConstantInitializer(Ctx, false))
2008        return false;
2009    }
2010    return true;
2011  }
2012  case ImplicitValueInitExprClass:
2013    return true;
2014  case ParenExprClass:
2015    return cast<ParenExpr>(this)->getSubExpr()
2016      ->isConstantInitializer(Ctx, IsForRef);
2017  case ChooseExprClass:
2018    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
2019      ->isConstantInitializer(Ctx, IsForRef);
2020  case UnaryOperatorClass: {
2021    const UnaryOperator* Exp = cast<UnaryOperator>(this);
2022    if (Exp->getOpcode() == UO_Extension)
2023      return Exp->getSubExpr()->isConstantInitializer(Ctx, false);
2024    break;
2025  }
2026  case BinaryOperatorClass: {
2027    // Special case &&foo - &&bar.  It would be nice to generalize this somehow
2028    // but this handles the common case.
2029    const BinaryOperator *Exp = cast<BinaryOperator>(this);
2030    if (Exp->getOpcode() == BO_Sub &&
2031        isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) &&
2032        isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx)))
2033      return true;
2034    break;
2035  }
2036  case CXXFunctionalCastExprClass:
2037  case CXXStaticCastExprClass:
2038  case ImplicitCastExprClass:
2039  case CStyleCastExprClass:
2040    // Handle casts with a destination that's a struct or union; this
2041    // deals with both the gcc no-op struct cast extension and the
2042    // cast-to-union extension.
2043    if (getType()->isRecordType())
2044      return cast<CastExpr>(this)->getSubExpr()
2045        ->isConstantInitializer(Ctx, false);
2046
2047    // Integer->integer casts can be handled here, which is important for
2048    // things like (int)(&&x-&&y).  Scary but true.
2049    if (getType()->isIntegerType() &&
2050        cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType())
2051      return cast<CastExpr>(this)->getSubExpr()
2052        ->isConstantInitializer(Ctx, false);
2053
2054    break;
2055  }
2056  return isEvaluatable(Ctx);
2057}
2058
2059/// isNullPointerConstant - C99 6.3.2.3p3 -  Return true if this is either an
2060/// integer constant expression with the value zero, or if this is one that is
2061/// cast to void*.
2062bool Expr::isNullPointerConstant(ASTContext &Ctx,
2063                                 NullPointerConstantValueDependence NPC) const {
2064  if (isValueDependent()) {
2065    switch (NPC) {
2066    case NPC_NeverValueDependent:
2067      assert(false && "Unexpected value dependent expression!");
2068      // If the unthinkable happens, fall through to the safest alternative.
2069
2070    case NPC_ValueDependentIsNull:
2071      return isTypeDependent() || getType()->isIntegralType(Ctx);
2072
2073    case NPC_ValueDependentIsNotNull:
2074      return false;
2075    }
2076  }
2077
2078  // Strip off a cast to void*, if it exists. Except in C++.
2079  if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
2080    if (!Ctx.getLangOptions().CPlusPlus) {
2081      // Check that it is a cast to void*.
2082      if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
2083        QualType Pointee = PT->getPointeeType();
2084        if (!Pointee.hasQualifiers() &&
2085            Pointee->isVoidType() &&                              // to void*
2086            CE->getSubExpr()->getType()->isIntegerType())         // from int.
2087          return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2088      }
2089    }
2090  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
2091    // Ignore the ImplicitCastExpr type entirely.
2092    return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2093  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
2094    // Accept ((void*)0) as a null pointer constant, as many other
2095    // implementations do.
2096    return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2097  } else if (const CXXDefaultArgExpr *DefaultArg
2098               = dyn_cast<CXXDefaultArgExpr>(this)) {
2099    // See through default argument expressions
2100    return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
2101  } else if (isa<GNUNullExpr>(this)) {
2102    // The GNU __null extension is always a null pointer constant.
2103    return true;
2104  }
2105
2106  // C++0x nullptr_t is always a null pointer constant.
2107  if (getType()->isNullPtrType())
2108    return true;
2109
2110  if (const RecordType *UT = getType()->getAsUnionType())
2111    if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
2112      if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
2113        const Expr *InitExpr = CLE->getInitializer();
2114        if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
2115          return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
2116      }
2117  // This expression must be an integer type.
2118  if (!getType()->isIntegerType() ||
2119      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
2120    return false;
2121
2122  // If we have an integer constant expression, we need to *evaluate* it and
2123  // test for the value 0.
2124  llvm::APSInt Result;
2125  return isIntegerConstantExpr(Result, Ctx) && Result == 0;
2126}
2127
2128/// \brief If this expression is an l-value for an Objective C
2129/// property, find the underlying property reference expression.
2130const ObjCPropertyRefExpr *Expr::getObjCProperty() const {
2131  const Expr *E = this;
2132  while (true) {
2133    assert((E->getValueKind() == VK_LValue &&
2134            E->getObjectKind() == OK_ObjCProperty) &&
2135           "expression is not a property reference");
2136    E = E->IgnoreParenCasts();
2137    if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
2138      if (BO->getOpcode() == BO_Comma) {
2139        E = BO->getRHS();
2140        continue;
2141      }
2142    }
2143
2144    break;
2145  }
2146
2147  return cast<ObjCPropertyRefExpr>(E);
2148}
2149
2150FieldDecl *Expr::getBitField() {
2151  Expr *E = this->IgnoreParens();
2152
2153  while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2154    if (ICE->getCastKind() == CK_LValueToRValue ||
2155        (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp))
2156      E = ICE->getSubExpr()->IgnoreParens();
2157    else
2158      break;
2159  }
2160
2161  if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
2162    if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
2163      if (Field->isBitField())
2164        return Field;
2165
2166  if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E))
2167    if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
2168      if (Field->isBitField())
2169        return Field;
2170
2171  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
2172    if (BinOp->isAssignmentOp() && BinOp->getLHS())
2173      return BinOp->getLHS()->getBitField();
2174
2175  return 0;
2176}
2177
2178bool Expr::refersToVectorElement() const {
2179  const Expr *E = this->IgnoreParens();
2180
2181  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2182    if (ICE->getValueKind() != VK_RValue &&
2183        ICE->getCastKind() == CK_NoOp)
2184      E = ICE->getSubExpr()->IgnoreParens();
2185    else
2186      break;
2187  }
2188
2189  if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
2190    return ASE->getBase()->getType()->isVectorType();
2191
2192  if (isa<ExtVectorElementExpr>(E))
2193    return true;
2194
2195  return false;
2196}
2197
2198/// isArrow - Return true if the base expression is a pointer to vector,
2199/// return false if the base expression is a vector.
2200bool ExtVectorElementExpr::isArrow() const {
2201  return getBase()->getType()->isPointerType();
2202}
2203
2204unsigned ExtVectorElementExpr::getNumElements() const {
2205  if (const VectorType *VT = getType()->getAs<VectorType>())
2206    return VT->getNumElements();
2207  return 1;
2208}
2209
2210/// containsDuplicateElements - Return true if any element access is repeated.
2211bool ExtVectorElementExpr::containsDuplicateElements() const {
2212  // FIXME: Refactor this code to an accessor on the AST node which returns the
2213  // "type" of component access, and share with code below and in Sema.
2214  llvm::StringRef Comp = Accessor->getName();
2215
2216  // Halving swizzles do not contain duplicate elements.
2217  if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
2218    return false;
2219
2220  // Advance past s-char prefix on hex swizzles.
2221  if (Comp[0] == 's' || Comp[0] == 'S')
2222    Comp = Comp.substr(1);
2223
2224  for (unsigned i = 0, e = Comp.size(); i != e; ++i)
2225    if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos)
2226        return true;
2227
2228  return false;
2229}
2230
2231/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
2232void ExtVectorElementExpr::getEncodedElementAccess(
2233                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
2234  llvm::StringRef Comp = Accessor->getName();
2235  if (Comp[0] == 's' || Comp[0] == 'S')
2236    Comp = Comp.substr(1);
2237
2238  bool isHi =   Comp == "hi";
2239  bool isLo =   Comp == "lo";
2240  bool isEven = Comp == "even";
2241  bool isOdd  = Comp == "odd";
2242
2243  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
2244    uint64_t Index;
2245
2246    if (isHi)
2247      Index = e + i;
2248    else if (isLo)
2249      Index = i;
2250    else if (isEven)
2251      Index = 2 * i;
2252    else if (isOdd)
2253      Index = 2 * i + 1;
2254    else
2255      Index = ExtVectorType::getAccessorIdx(Comp[i]);
2256
2257    Elts.push_back(Index);
2258  }
2259}
2260
2261ObjCMessageExpr::ObjCMessageExpr(QualType T,
2262                                 ExprValueKind VK,
2263                                 SourceLocation LBracLoc,
2264                                 SourceLocation SuperLoc,
2265                                 bool IsInstanceSuper,
2266                                 QualType SuperType,
2267                                 Selector Sel,
2268                                 SourceLocation SelLoc,
2269                                 ObjCMethodDecl *Method,
2270                                 Expr **Args, unsigned NumArgs,
2271                                 SourceLocation RBracLoc)
2272  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
2273         /*TypeDependent=*/false, /*ValueDependent=*/false,
2274         /*ContainsUnexpandedParameterPack=*/false),
2275    NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
2276    HasMethod(Method != 0), SuperLoc(SuperLoc),
2277    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2278                                                       : Sel.getAsOpaquePtr())),
2279    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2280{
2281  setReceiverPointer(SuperType.getAsOpaquePtr());
2282  if (NumArgs)
2283    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
2284}
2285
2286ObjCMessageExpr::ObjCMessageExpr(QualType T,
2287                                 ExprValueKind VK,
2288                                 SourceLocation LBracLoc,
2289                                 TypeSourceInfo *Receiver,
2290                                 Selector Sel,
2291                                 SourceLocation SelLoc,
2292                                 ObjCMethodDecl *Method,
2293                                 Expr **Args, unsigned NumArgs,
2294                                 SourceLocation RBracLoc)
2295  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
2296         T->isDependentType(), T->containsUnexpandedParameterPack()),
2297    NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0),
2298    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2299                                                       : Sel.getAsOpaquePtr())),
2300    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2301{
2302  setReceiverPointer(Receiver);
2303  Expr **MyArgs = getArgs();
2304  for (unsigned I = 0; I != NumArgs; ++I) {
2305    if (Args[I]->isTypeDependent())
2306      ExprBits.TypeDependent = true;
2307    if (Args[I]->isValueDependent())
2308      ExprBits.ValueDependent = true;
2309    if (Args[I]->containsUnexpandedParameterPack())
2310      ExprBits.ContainsUnexpandedParameterPack = true;
2311
2312    MyArgs[I] = Args[I];
2313  }
2314}
2315
2316ObjCMessageExpr::ObjCMessageExpr(QualType T,
2317                                 ExprValueKind VK,
2318                                 SourceLocation LBracLoc,
2319                                 Expr *Receiver,
2320                                 Selector Sel,
2321                                 SourceLocation SelLoc,
2322                                 ObjCMethodDecl *Method,
2323                                 Expr **Args, unsigned NumArgs,
2324                                 SourceLocation RBracLoc)
2325  : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
2326         Receiver->isTypeDependent(),
2327         Receiver->containsUnexpandedParameterPack()),
2328    NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0),
2329    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2330                                                       : Sel.getAsOpaquePtr())),
2331    SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2332{
2333  setReceiverPointer(Receiver);
2334  Expr **MyArgs = getArgs();
2335  for (unsigned I = 0; I != NumArgs; ++I) {
2336    if (Args[I]->isTypeDependent())
2337      ExprBits.TypeDependent = true;
2338    if (Args[I]->isValueDependent())
2339      ExprBits.ValueDependent = true;
2340    if (Args[I]->containsUnexpandedParameterPack())
2341      ExprBits.ContainsUnexpandedParameterPack = true;
2342
2343    MyArgs[I] = Args[I];
2344  }
2345}
2346
2347ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2348                                         ExprValueKind VK,
2349                                         SourceLocation LBracLoc,
2350                                         SourceLocation SuperLoc,
2351                                         bool IsInstanceSuper,
2352                                         QualType SuperType,
2353                                         Selector Sel,
2354                                         SourceLocation SelLoc,
2355                                         ObjCMethodDecl *Method,
2356                                         Expr **Args, unsigned NumArgs,
2357                                         SourceLocation RBracLoc) {
2358  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2359    NumArgs * sizeof(Expr *);
2360  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2361  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
2362                                   SuperType, Sel, SelLoc, Method, Args,NumArgs,
2363                                   RBracLoc);
2364}
2365
2366ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2367                                         ExprValueKind VK,
2368                                         SourceLocation LBracLoc,
2369                                         TypeSourceInfo *Receiver,
2370                                         Selector Sel,
2371                                         SourceLocation SelLoc,
2372                                         ObjCMethodDecl *Method,
2373                                         Expr **Args, unsigned NumArgs,
2374                                         SourceLocation RBracLoc) {
2375  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2376    NumArgs * sizeof(Expr *);
2377  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2378  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2379                                   Method, Args, NumArgs, RBracLoc);
2380}
2381
2382ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2383                                         ExprValueKind VK,
2384                                         SourceLocation LBracLoc,
2385                                         Expr *Receiver,
2386                                         Selector Sel,
2387                                         SourceLocation SelLoc,
2388                                         ObjCMethodDecl *Method,
2389                                         Expr **Args, unsigned NumArgs,
2390                                         SourceLocation RBracLoc) {
2391  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2392    NumArgs * sizeof(Expr *);
2393  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2394  return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, SelLoc,
2395                                   Method, Args, NumArgs, RBracLoc);
2396}
2397
2398ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
2399                                              unsigned NumArgs) {
2400  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2401    NumArgs * sizeof(Expr *);
2402  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2403  return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
2404}
2405
2406SourceRange ObjCMessageExpr::getReceiverRange() const {
2407  switch (getReceiverKind()) {
2408  case Instance:
2409    return getInstanceReceiver()->getSourceRange();
2410
2411  case Class:
2412    return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
2413
2414  case SuperInstance:
2415  case SuperClass:
2416    return getSuperLoc();
2417  }
2418
2419  return SourceLocation();
2420}
2421
2422Selector ObjCMessageExpr::getSelector() const {
2423  if (HasMethod)
2424    return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
2425                                                               ->getSelector();
2426  return Selector(SelectorOrMethod);
2427}
2428
2429ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
2430  switch (getReceiverKind()) {
2431  case Instance:
2432    if (const ObjCObjectPointerType *Ptr
2433          = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
2434      return Ptr->getInterfaceDecl();
2435    break;
2436
2437  case Class:
2438    if (const ObjCObjectType *Ty
2439          = getClassReceiver()->getAs<ObjCObjectType>())
2440      return Ty->getInterface();
2441    break;
2442
2443  case SuperInstance:
2444    if (const ObjCObjectPointerType *Ptr
2445          = getSuperType()->getAs<ObjCObjectPointerType>())
2446      return Ptr->getInterfaceDecl();
2447    break;
2448
2449  case SuperClass:
2450    if (const ObjCObjectPointerType *Iface
2451                       = getSuperType()->getAs<ObjCObjectPointerType>())
2452      return Iface->getInterfaceDecl();
2453    break;
2454  }
2455
2456  return 0;
2457}
2458
2459bool ChooseExpr::isConditionTrue(ASTContext &C) const {
2460  return getCond()->EvaluateAsInt(C) != 0;
2461}
2462
2463ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
2464                                     QualType Type, SourceLocation BLoc,
2465                                     SourceLocation RP)
2466   : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
2467          Type->isDependentType(), Type->isDependentType(),
2468          Type->containsUnexpandedParameterPack()),
2469     BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
2470{
2471  SubExprs = new (C) Stmt*[nexpr];
2472  for (unsigned i = 0; i < nexpr; i++) {
2473    if (args[i]->isTypeDependent())
2474      ExprBits.TypeDependent = true;
2475    if (args[i]->isValueDependent())
2476      ExprBits.ValueDependent = true;
2477    if (args[i]->containsUnexpandedParameterPack())
2478      ExprBits.ContainsUnexpandedParameterPack = true;
2479
2480    SubExprs[i] = args[i];
2481  }
2482}
2483
2484void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
2485                                 unsigned NumExprs) {
2486  if (SubExprs) C.Deallocate(SubExprs);
2487
2488  SubExprs = new (C) Stmt* [NumExprs];
2489  this->NumExprs = NumExprs;
2490  memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
2491}
2492
2493//===----------------------------------------------------------------------===//
2494//  DesignatedInitExpr
2495//===----------------------------------------------------------------------===//
2496
2497IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() {
2498  assert(Kind == FieldDesignator && "Only valid on a field designator");
2499  if (Field.NameOrField & 0x01)
2500    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
2501  else
2502    return getField()->getIdentifier();
2503}
2504
2505DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
2506                                       unsigned NumDesignators,
2507                                       const Designator *Designators,
2508                                       SourceLocation EqualOrColonLoc,
2509                                       bool GNUSyntax,
2510                                       Expr **IndexExprs,
2511                                       unsigned NumIndexExprs,
2512                                       Expr *Init)
2513  : Expr(DesignatedInitExprClass, Ty,
2514         Init->getValueKind(), Init->getObjectKind(),
2515         Init->isTypeDependent(), Init->isValueDependent(),
2516         Init->containsUnexpandedParameterPack()),
2517    EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
2518    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
2519  this->Designators = new (C) Designator[NumDesignators];
2520
2521  // Record the initializer itself.
2522  child_iterator Child = child_begin();
2523  *Child++ = Init;
2524
2525  // Copy the designators and their subexpressions, computing
2526  // value-dependence along the way.
2527  unsigned IndexIdx = 0;
2528  for (unsigned I = 0; I != NumDesignators; ++I) {
2529    this->Designators[I] = Designators[I];
2530
2531    if (this->Designators[I].isArrayDesignator()) {
2532      // Compute type- and value-dependence.
2533      Expr *Index = IndexExprs[IndexIdx];
2534      if (Index->isTypeDependent() || Index->isValueDependent())
2535        ExprBits.ValueDependent = true;
2536
2537      // Propagate unexpanded parameter packs.
2538      if (Index->containsUnexpandedParameterPack())
2539        ExprBits.ContainsUnexpandedParameterPack = true;
2540
2541      // Copy the index expressions into permanent storage.
2542      *Child++ = IndexExprs[IndexIdx++];
2543    } else if (this->Designators[I].isArrayRangeDesignator()) {
2544      // Compute type- and value-dependence.
2545      Expr *Start = IndexExprs[IndexIdx];
2546      Expr *End = IndexExprs[IndexIdx + 1];
2547      if (Start->isTypeDependent() || Start->isValueDependent() ||
2548          End->isTypeDependent() || End->isValueDependent())
2549        ExprBits.ValueDependent = true;
2550
2551      // Propagate unexpanded parameter packs.
2552      if (Start->containsUnexpandedParameterPack() ||
2553          End->containsUnexpandedParameterPack())
2554        ExprBits.ContainsUnexpandedParameterPack = true;
2555
2556      // Copy the start/end expressions into permanent storage.
2557      *Child++ = IndexExprs[IndexIdx++];
2558      *Child++ = IndexExprs[IndexIdx++];
2559    }
2560  }
2561
2562  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
2563}
2564
2565DesignatedInitExpr *
2566DesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
2567                           unsigned NumDesignators,
2568                           Expr **IndexExprs, unsigned NumIndexExprs,
2569                           SourceLocation ColonOrEqualLoc,
2570                           bool UsesColonSyntax, Expr *Init) {
2571  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2572                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2573  return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
2574                                      ColonOrEqualLoc, UsesColonSyntax,
2575                                      IndexExprs, NumIndexExprs, Init);
2576}
2577
2578DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
2579                                                    unsigned NumIndexExprs) {
2580  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2581                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2582  return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
2583}
2584
2585void DesignatedInitExpr::setDesignators(ASTContext &C,
2586                                        const Designator *Desigs,
2587                                        unsigned NumDesigs) {
2588  Designators = new (C) Designator[NumDesigs];
2589  NumDesignators = NumDesigs;
2590  for (unsigned I = 0; I != NumDesigs; ++I)
2591    Designators[I] = Desigs[I];
2592}
2593
2594SourceRange DesignatedInitExpr::getSourceRange() const {
2595  SourceLocation StartLoc;
2596  Designator &First =
2597    *const_cast<DesignatedInitExpr*>(this)->designators_begin();
2598  if (First.isFieldDesignator()) {
2599    if (GNUSyntax)
2600      StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
2601    else
2602      StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
2603  } else
2604    StartLoc =
2605      SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
2606  return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
2607}
2608
2609Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
2610  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
2611  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2612  Ptr += sizeof(DesignatedInitExpr);
2613  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2614  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2615}
2616
2617Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
2618  assert(D.Kind == Designator::ArrayRangeDesignator &&
2619         "Requires array range designator");
2620  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2621  Ptr += sizeof(DesignatedInitExpr);
2622  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2623  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2624}
2625
2626Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
2627  assert(D.Kind == Designator::ArrayRangeDesignator &&
2628         "Requires array range designator");
2629  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2630  Ptr += sizeof(DesignatedInitExpr);
2631  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2632  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
2633}
2634
2635/// \brief Replaces the designator at index @p Idx with the series
2636/// of designators in [First, Last).
2637void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
2638                                          const Designator *First,
2639                                          const Designator *Last) {
2640  unsigned NumNewDesignators = Last - First;
2641  if (NumNewDesignators == 0) {
2642    std::copy_backward(Designators + Idx + 1,
2643                       Designators + NumDesignators,
2644                       Designators + Idx);
2645    --NumNewDesignators;
2646    return;
2647  } else if (NumNewDesignators == 1) {
2648    Designators[Idx] = *First;
2649    return;
2650  }
2651
2652  Designator *NewDesignators
2653    = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
2654  std::copy(Designators, Designators + Idx, NewDesignators);
2655  std::copy(First, Last, NewDesignators + Idx);
2656  std::copy(Designators + Idx + 1, Designators + NumDesignators,
2657            NewDesignators + Idx + NumNewDesignators);
2658  Designators = NewDesignators;
2659  NumDesignators = NumDesignators - 1 + NumNewDesignators;
2660}
2661
2662ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
2663                             Expr **exprs, unsigned nexprs,
2664                             SourceLocation rparenloc)
2665  : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
2666         false, false, false),
2667    NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
2668
2669  Exprs = new (C) Stmt*[nexprs];
2670  for (unsigned i = 0; i != nexprs; ++i) {
2671    if (exprs[i]->isTypeDependent())
2672      ExprBits.TypeDependent = true;
2673    if (exprs[i]->isValueDependent())
2674      ExprBits.ValueDependent = true;
2675    if (exprs[i]->containsUnexpandedParameterPack())
2676      ExprBits.ContainsUnexpandedParameterPack = true;
2677
2678    Exprs[i] = exprs[i];
2679  }
2680}
2681
2682//===----------------------------------------------------------------------===//
2683//  ExprIterator.
2684//===----------------------------------------------------------------------===//
2685
2686Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
2687Expr* ExprIterator::operator*() const { return cast<Expr>(*I); }
2688Expr* ExprIterator::operator->() const { return cast<Expr>(*I); }
2689const Expr* ConstExprIterator::operator[](size_t idx) const {
2690  return cast<Expr>(I[idx]);
2691}
2692const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
2693const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
2694
2695//===----------------------------------------------------------------------===//
2696//  Child Iterators for iterating over subexpressions/substatements
2697//===----------------------------------------------------------------------===//
2698
2699// DeclRefExpr
2700Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
2701Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
2702
2703// ObjCIvarRefExpr
2704Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
2705Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
2706
2707// ObjCPropertyRefExpr
2708Stmt::child_iterator ObjCPropertyRefExpr::child_begin()
2709{
2710  if (Receiver.is<Stmt*>()) {
2711    // Hack alert!
2712    return reinterpret_cast<Stmt**> (&Receiver);
2713  }
2714  return child_iterator();
2715}
2716
2717Stmt::child_iterator ObjCPropertyRefExpr::child_end()
2718{ return Receiver.is<Stmt*>() ?
2719          reinterpret_cast<Stmt**> (&Receiver)+1 :
2720          child_iterator();
2721}
2722
2723// ObjCIsaExpr
2724Stmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; }
2725Stmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; }
2726
2727// PredefinedExpr
2728Stmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); }
2729Stmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); }
2730
2731// IntegerLiteral
2732Stmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); }
2733Stmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); }
2734
2735// CharacterLiteral
2736Stmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();}
2737Stmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); }
2738
2739// FloatingLiteral
2740Stmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); }
2741Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
2742
2743// ImaginaryLiteral
2744Stmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; }
2745Stmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; }
2746
2747// StringLiteral
2748Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
2749Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
2750
2751// ParenExpr
2752Stmt::child_iterator ParenExpr::child_begin() { return &Val; }
2753Stmt::child_iterator ParenExpr::child_end() { return &Val+1; }
2754
2755// UnaryOperator
2756Stmt::child_iterator UnaryOperator::child_begin() { return &Val; }
2757Stmt::child_iterator UnaryOperator::child_end() { return &Val+1; }
2758
2759// OffsetOfExpr
2760Stmt::child_iterator OffsetOfExpr::child_begin() {
2761  return reinterpret_cast<Stmt **> (reinterpret_cast<OffsetOfNode *> (this + 1)
2762                                      + NumComps);
2763}
2764Stmt::child_iterator OffsetOfExpr::child_end() {
2765  return child_iterator(&*child_begin() + NumExprs);
2766}
2767
2768// SizeOfAlignOfExpr
2769Stmt::child_iterator SizeOfAlignOfExpr::child_begin() {
2770  // If this is of a type and the type is a VLA type (and not a typedef), the
2771  // size expression of the VLA needs to be treated as an executable expression.
2772  // Why isn't this weirdness documented better in StmtIterator?
2773  if (isArgumentType()) {
2774    if (VariableArrayType* T = dyn_cast<VariableArrayType>(
2775                                   getArgumentType().getTypePtr()))
2776      return child_iterator(T);
2777    return child_iterator();
2778  }
2779  return child_iterator(&Argument.Ex);
2780}
2781Stmt::child_iterator SizeOfAlignOfExpr::child_end() {
2782  if (isArgumentType())
2783    return child_iterator();
2784  return child_iterator(&Argument.Ex + 1);
2785}
2786
2787// ArraySubscriptExpr
2788Stmt::child_iterator ArraySubscriptExpr::child_begin() {
2789  return &SubExprs[0];
2790}
2791Stmt::child_iterator ArraySubscriptExpr::child_end() {
2792  return &SubExprs[0]+END_EXPR;
2793}
2794
2795// CallExpr
2796Stmt::child_iterator CallExpr::child_begin() {
2797  return &SubExprs[0];
2798}
2799Stmt::child_iterator CallExpr::child_end() {
2800  return &SubExprs[0]+NumArgs+ARGS_START;
2801}
2802
2803// MemberExpr
2804Stmt::child_iterator MemberExpr::child_begin() { return &Base; }
2805Stmt::child_iterator MemberExpr::child_end() { return &Base+1; }
2806
2807// ExtVectorElementExpr
2808Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; }
2809Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; }
2810
2811// CompoundLiteralExpr
2812Stmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; }
2813Stmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; }
2814
2815// CastExpr
2816Stmt::child_iterator CastExpr::child_begin() { return &Op; }
2817Stmt::child_iterator CastExpr::child_end() { return &Op+1; }
2818
2819// BinaryOperator
2820Stmt::child_iterator BinaryOperator::child_begin() {
2821  return &SubExprs[0];
2822}
2823Stmt::child_iterator BinaryOperator::child_end() {
2824  return &SubExprs[0]+END_EXPR;
2825}
2826
2827// ConditionalOperator
2828Stmt::child_iterator ConditionalOperator::child_begin() {
2829  return &SubExprs[0];
2830}
2831Stmt::child_iterator ConditionalOperator::child_end() {
2832  return &SubExprs[0]+END_EXPR;
2833}
2834
2835// AddrLabelExpr
2836Stmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); }
2837Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
2838
2839// StmtExpr
2840Stmt::child_iterator StmtExpr::child_begin() { return &SubStmt; }
2841Stmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; }
2842
2843
2844// ChooseExpr
2845Stmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; }
2846Stmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; }
2847
2848// GNUNullExpr
2849Stmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); }
2850Stmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); }
2851
2852// ShuffleVectorExpr
2853Stmt::child_iterator ShuffleVectorExpr::child_begin() {
2854  return &SubExprs[0];
2855}
2856Stmt::child_iterator ShuffleVectorExpr::child_end() {
2857  return &SubExprs[0]+NumExprs;
2858}
2859
2860// VAArgExpr
2861Stmt::child_iterator VAArgExpr::child_begin() { return &Val; }
2862Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
2863
2864// InitListExpr
2865Stmt::child_iterator InitListExpr::child_begin() {
2866  return InitExprs.size() ? &InitExprs[0] : 0;
2867}
2868Stmt::child_iterator InitListExpr::child_end() {
2869  return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
2870}
2871
2872// DesignatedInitExpr
2873Stmt::child_iterator DesignatedInitExpr::child_begin() {
2874  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2875  Ptr += sizeof(DesignatedInitExpr);
2876  return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2877}
2878Stmt::child_iterator DesignatedInitExpr::child_end() {
2879  return child_iterator(&*child_begin() + NumSubExprs);
2880}
2881
2882// ImplicitValueInitExpr
2883Stmt::child_iterator ImplicitValueInitExpr::child_begin() {
2884  return child_iterator();
2885}
2886
2887Stmt::child_iterator ImplicitValueInitExpr::child_end() {
2888  return child_iterator();
2889}
2890
2891// ParenListExpr
2892Stmt::child_iterator ParenListExpr::child_begin() {
2893  return &Exprs[0];
2894}
2895Stmt::child_iterator ParenListExpr::child_end() {
2896  return &Exprs[0]+NumExprs;
2897}
2898
2899// ObjCStringLiteral
2900Stmt::child_iterator ObjCStringLiteral::child_begin() {
2901  return &String;
2902}
2903Stmt::child_iterator ObjCStringLiteral::child_end() {
2904  return &String+1;
2905}
2906
2907// ObjCEncodeExpr
2908Stmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); }
2909Stmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); }
2910
2911// ObjCSelectorExpr
2912Stmt::child_iterator ObjCSelectorExpr::child_begin() {
2913  return child_iterator();
2914}
2915Stmt::child_iterator ObjCSelectorExpr::child_end() {
2916  return child_iterator();
2917}
2918
2919// ObjCProtocolExpr
2920Stmt::child_iterator ObjCProtocolExpr::child_begin() {
2921  return child_iterator();
2922}
2923Stmt::child_iterator ObjCProtocolExpr::child_end() {
2924  return child_iterator();
2925}
2926
2927// ObjCMessageExpr
2928Stmt::child_iterator ObjCMessageExpr::child_begin() {
2929  if (getReceiverKind() == Instance)
2930    return reinterpret_cast<Stmt **>(this + 1);
2931  return reinterpret_cast<Stmt **>(getArgs());
2932}
2933Stmt::child_iterator ObjCMessageExpr::child_end() {
2934  return reinterpret_cast<Stmt **>(getArgs() + getNumArgs());
2935}
2936
2937// Blocks
2938Stmt::child_iterator BlockExpr::child_begin() { return child_iterator(); }
2939Stmt::child_iterator BlockExpr::child_end() { return child_iterator(); }
2940
2941Stmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();}
2942Stmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); }
2943
2944// OpaqueValueExpr
2945SourceRange OpaqueValueExpr::getSourceRange() const { return SourceRange(); }
2946Stmt::child_iterator OpaqueValueExpr::child_begin() { return child_iterator(); }
2947Stmt::child_iterator OpaqueValueExpr::child_end() { return child_iterator(); }
2948
2949