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