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