Expr.cpp revision 85bcd9920582f4d3879d8fbbaf4ca4fe09690160
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/Basic/Builtins.h"
24#include "clang/Basic/TargetInfo.h"
25#include "llvm/Support/ErrorHandling.h"
26#include "llvm/Support/raw_ostream.h"
27#include <algorithm>
28using namespace clang;
29
30/// isKnownToHaveBooleanValue - Return true if this is an integer expression
31/// that is known to return 0 or 1.  This happens for _Bool/bool expressions
32/// but also int expressions which are produced by things like comparisons in
33/// C.
34bool Expr::isKnownToHaveBooleanValue() const {
35  // If this value has _Bool type, it is obvious 0/1.
36  if (getType()->isBooleanType()) return true;
37  // If this is a non-scalar-integer type, we don't care enough to try.
38  if (!getType()->isIntegralType()) return false;
39
40  if (const ParenExpr *PE = dyn_cast<ParenExpr>(this))
41    return PE->getSubExpr()->isKnownToHaveBooleanValue();
42
43  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(this)) {
44    switch (UO->getOpcode()) {
45    case UnaryOperator::Plus:
46    case UnaryOperator::Extension:
47      return UO->getSubExpr()->isKnownToHaveBooleanValue();
48    default:
49      return false;
50    }
51  }
52
53  if (const CastExpr *CE = dyn_cast<CastExpr>(this))
54    return CE->getSubExpr()->isKnownToHaveBooleanValue();
55
56  if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(this)) {
57    switch (BO->getOpcode()) {
58    default: return false;
59    case BinaryOperator::LT:   // Relational operators.
60    case BinaryOperator::GT:
61    case BinaryOperator::LE:
62    case BinaryOperator::GE:
63    case BinaryOperator::EQ:   // Equality operators.
64    case BinaryOperator::NE:
65    case BinaryOperator::LAnd: // AND operator.
66    case BinaryOperator::LOr:  // Logical OR operator.
67      return true;
68
69    case BinaryOperator::And:  // Bitwise AND operator.
70    case BinaryOperator::Xor:  // Bitwise XOR operator.
71    case BinaryOperator::Or:   // Bitwise OR operator.
72      // Handle things like (x==2)|(y==12).
73      return BO->getLHS()->isKnownToHaveBooleanValue() &&
74             BO->getRHS()->isKnownToHaveBooleanValue();
75
76    case BinaryOperator::Comma:
77    case BinaryOperator::Assign:
78      return BO->getRHS()->isKnownToHaveBooleanValue();
79    }
80  }
81
82  if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(this))
83    return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
84           CO->getFalseExpr()->isKnownToHaveBooleanValue();
85
86  return false;
87}
88
89//===----------------------------------------------------------------------===//
90// Primary Expressions.
91//===----------------------------------------------------------------------===//
92
93void ExplicitTemplateArgumentList::initializeFrom(
94                                      const TemplateArgumentListInfo &Info) {
95  LAngleLoc = Info.getLAngleLoc();
96  RAngleLoc = Info.getRAngleLoc();
97  NumTemplateArgs = Info.size();
98
99  TemplateArgumentLoc *ArgBuffer = getTemplateArgs();
100  for (unsigned i = 0; i != NumTemplateArgs; ++i)
101    new (&ArgBuffer[i]) TemplateArgumentLoc(Info[i]);
102}
103
104void ExplicitTemplateArgumentList::copyInto(
105                                      TemplateArgumentListInfo &Info) const {
106  Info.setLAngleLoc(LAngleLoc);
107  Info.setRAngleLoc(RAngleLoc);
108  for (unsigned I = 0; I != NumTemplateArgs; ++I)
109    Info.addArgument(getTemplateArgs()[I]);
110}
111
112std::size_t ExplicitTemplateArgumentList::sizeFor(
113                                      const TemplateArgumentListInfo &Info) {
114  return sizeof(ExplicitTemplateArgumentList) +
115         sizeof(TemplateArgumentLoc) * Info.size();
116}
117
118void DeclRefExpr::computeDependence() {
119  TypeDependent = false;
120  ValueDependent = false;
121
122  NamedDecl *D = getDecl();
123
124  // (TD) C++ [temp.dep.expr]p3:
125  //   An id-expression is type-dependent if it contains:
126  //
127  // and
128  //
129  // (VD) C++ [temp.dep.constexpr]p2:
130  //  An identifier is value-dependent if it is:
131
132  //  (TD)  - an identifier that was declared with dependent type
133  //  (VD)  - a name declared with a dependent type,
134  if (getType()->isDependentType()) {
135    TypeDependent = true;
136    ValueDependent = true;
137  }
138  //  (TD)  - a conversion-function-id that specifies a dependent type
139  else if (D->getDeclName().getNameKind()
140                               == DeclarationName::CXXConversionFunctionName &&
141           D->getDeclName().getCXXNameType()->isDependentType()) {
142    TypeDependent = true;
143    ValueDependent = true;
144  }
145  //  (TD)  - a template-id that is dependent,
146  else if (hasExplicitTemplateArgumentList() &&
147           TemplateSpecializationType::anyDependentTemplateArguments(
148                                                       getTemplateArgs(),
149                                                       getNumTemplateArgs())) {
150    TypeDependent = true;
151    ValueDependent = true;
152  }
153  //  (VD)  - the name of a non-type template parameter,
154  else if (isa<NonTypeTemplateParmDecl>(D))
155    ValueDependent = true;
156  //  (VD) - a constant with integral or enumeration type and is
157  //         initialized with an expression that is value-dependent.
158  else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
159    if (Var->getType()->isIntegralType() &&
160        Var->getType().getCVRQualifiers() == Qualifiers::Const) {
161      if (const Expr *Init = Var->getAnyInitializer())
162        if (Init->isValueDependent())
163          ValueDependent = true;
164    }
165    // (VD) - FIXME: Missing from the standard:
166    //      -  a member function or a static data member of the current
167    //         instantiation
168    else if (Var->isStaticDataMember() &&
169             Var->getDeclContext()->isDependentContext())
170      ValueDependent = true;
171  }
172  // (VD) - FIXME: Missing from the standard:
173  //      -  a member function or a static data member of the current
174  //         instantiation
175  else if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext())
176    ValueDependent = true;
177  //  (TD)  - a nested-name-specifier or a qualified-id that names a
178  //          member of an unknown specialization.
179  //        (handled by DependentScopeDeclRefExpr)
180}
181
182DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier,
183                         SourceRange QualifierRange,
184                         ValueDecl *D, SourceLocation NameLoc,
185                         const TemplateArgumentListInfo *TemplateArgs,
186                         QualType T)
187  : Expr(DeclRefExprClass, T, false, false),
188    DecoratedD(D,
189               (Qualifier? HasQualifierFlag : 0) |
190               (TemplateArgs ? HasExplicitTemplateArgumentListFlag : 0)),
191    Loc(NameLoc) {
192  if (Qualifier) {
193    NameQualifier *NQ = getNameQualifier();
194    NQ->NNS = Qualifier;
195    NQ->Range = QualifierRange;
196  }
197
198  if (TemplateArgs)
199    getExplicitTemplateArgumentList()->initializeFrom(*TemplateArgs);
200
201  computeDependence();
202}
203
204DeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
205                                 NestedNameSpecifier *Qualifier,
206                                 SourceRange QualifierRange,
207                                 ValueDecl *D,
208                                 SourceLocation NameLoc,
209                                 QualType T,
210                                 const TemplateArgumentListInfo *TemplateArgs) {
211  std::size_t Size = sizeof(DeclRefExpr);
212  if (Qualifier != 0)
213    Size += sizeof(NameQualifier);
214
215  if (TemplateArgs)
216    Size += ExplicitTemplateArgumentList::sizeFor(*TemplateArgs);
217
218  void *Mem = Context.Allocate(Size, llvm::alignof<DeclRefExpr>());
219  return new (Mem) DeclRefExpr(Qualifier, QualifierRange, D, NameLoc,
220                               TemplateArgs, T);
221}
222
223SourceRange DeclRefExpr::getSourceRange() const {
224  // FIXME: Does not handle multi-token names well, e.g., operator[].
225  SourceRange R(Loc);
226
227  if (hasQualifier())
228    R.setBegin(getQualifierRange().getBegin());
229  if (hasExplicitTemplateArgumentList())
230    R.setEnd(getRAngleLoc());
231  return R;
232}
233
234// FIXME: Maybe this should use DeclPrinter with a special "print predefined
235// expr" policy instead.
236std::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
237  ASTContext &Context = CurrentDecl->getASTContext();
238
239  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
240    if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
241      return FD->getNameAsString();
242
243    llvm::SmallString<256> Name;
244    llvm::raw_svector_ostream Out(Name);
245
246    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
247      if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
248        Out << "virtual ";
249      if (MD->isStatic())
250        Out << "static ";
251    }
252
253    PrintingPolicy Policy(Context.getLangOptions());
254
255    std::string Proto = FD->getQualifiedNameAsString(Policy);
256
257    const FunctionType *AFT = FD->getType()->getAs<FunctionType>();
258    const FunctionProtoType *FT = 0;
259    if (FD->hasWrittenPrototype())
260      FT = dyn_cast<FunctionProtoType>(AFT);
261
262    Proto += "(";
263    if (FT) {
264      llvm::raw_string_ostream POut(Proto);
265      for (unsigned i = 0, e = FD->getNumParams(); i != e; ++i) {
266        if (i) POut << ", ";
267        std::string Param;
268        FD->getParamDecl(i)->getType().getAsStringInternal(Param, Policy);
269        POut << Param;
270      }
271
272      if (FT->isVariadic()) {
273        if (FD->getNumParams()) POut << ", ";
274        POut << "...";
275      }
276    }
277    Proto += ")";
278
279    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
280      Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
281      if (ThisQuals.hasConst())
282        Proto += " const";
283      if (ThisQuals.hasVolatile())
284        Proto += " volatile";
285    }
286
287    if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
288      AFT->getResultType().getAsStringInternal(Proto, Policy);
289
290    Out << Proto;
291
292    Out.flush();
293    return Name.str().str();
294  }
295  if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
296    llvm::SmallString<256> Name;
297    llvm::raw_svector_ostream Out(Name);
298    Out << (MD->isInstanceMethod() ? '-' : '+');
299    Out << '[';
300
301    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
302    // a null check to avoid a crash.
303    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
304      Out << ID;
305
306    if (const ObjCCategoryImplDecl *CID =
307        dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
308      Out << '(' << CID << ')';
309
310    Out <<  ' ';
311    Out << MD->getSelector().getAsString();
312    Out <<  ']';
313
314    Out.flush();
315    return Name.str().str();
316  }
317  if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
318    // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
319    return "top level";
320  }
321  return "";
322}
323
324/// getValueAsApproximateDouble - This returns the value as an inaccurate
325/// double.  Note that this may cause loss of precision, but is useful for
326/// debugging dumps, etc.
327double FloatingLiteral::getValueAsApproximateDouble() const {
328  llvm::APFloat V = getValue();
329  bool ignored;
330  V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
331            &ignored);
332  return V.convertToDouble();
333}
334
335StringLiteral *StringLiteral::Create(ASTContext &C, const char *StrData,
336                                     unsigned ByteLength, bool Wide,
337                                     QualType Ty,
338                                     const SourceLocation *Loc,
339                                     unsigned NumStrs) {
340  // Allocate enough space for the StringLiteral plus an array of locations for
341  // any concatenated string tokens.
342  void *Mem = C.Allocate(sizeof(StringLiteral)+
343                         sizeof(SourceLocation)*(NumStrs-1),
344                         llvm::alignof<StringLiteral>());
345  StringLiteral *SL = new (Mem) StringLiteral(Ty);
346
347  // OPTIMIZE: could allocate this appended to the StringLiteral.
348  char *AStrData = new (C, 1) char[ByteLength];
349  memcpy(AStrData, StrData, ByteLength);
350  SL->StrData = AStrData;
351  SL->ByteLength = ByteLength;
352  SL->IsWide = Wide;
353  SL->TokLocs[0] = Loc[0];
354  SL->NumConcatenated = NumStrs;
355
356  if (NumStrs != 1)
357    memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
358  return SL;
359}
360
361StringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
362  void *Mem = C.Allocate(sizeof(StringLiteral)+
363                         sizeof(SourceLocation)*(NumStrs-1),
364                         llvm::alignof<StringLiteral>());
365  StringLiteral *SL = new (Mem) StringLiteral(QualType());
366  SL->StrData = 0;
367  SL->ByteLength = 0;
368  SL->NumConcatenated = NumStrs;
369  return SL;
370}
371
372void StringLiteral::DoDestroy(ASTContext &C) {
373  C.Deallocate(const_cast<char*>(StrData));
374  Expr::DoDestroy(C);
375}
376
377void StringLiteral::setString(ASTContext &C, llvm::StringRef Str) {
378  if (StrData)
379    C.Deallocate(const_cast<char*>(StrData));
380
381  char *AStrData = new (C, 1) char[Str.size()];
382  memcpy(AStrData, Str.data(), Str.size());
383  StrData = AStrData;
384  ByteLength = Str.size();
385}
386
387/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
388/// corresponds to, e.g. "sizeof" or "[pre]++".
389const char *UnaryOperator::getOpcodeStr(Opcode Op) {
390  switch (Op) {
391  default: assert(0 && "Unknown unary operator");
392  case PostInc: return "++";
393  case PostDec: return "--";
394  case PreInc:  return "++";
395  case PreDec:  return "--";
396  case AddrOf:  return "&";
397  case Deref:   return "*";
398  case Plus:    return "+";
399  case Minus:   return "-";
400  case Not:     return "~";
401  case LNot:    return "!";
402  case Real:    return "__real";
403  case Imag:    return "__imag";
404  case Extension: return "__extension__";
405  case OffsetOf: return "__builtin_offsetof";
406  }
407}
408
409UnaryOperator::Opcode
410UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
411  switch (OO) {
412  default: assert(false && "No unary operator for overloaded function");
413  case OO_PlusPlus:   return Postfix ? PostInc : PreInc;
414  case OO_MinusMinus: return Postfix ? PostDec : PreDec;
415  case OO_Amp:        return AddrOf;
416  case OO_Star:       return Deref;
417  case OO_Plus:       return Plus;
418  case OO_Minus:      return Minus;
419  case OO_Tilde:      return Not;
420  case OO_Exclaim:    return LNot;
421  }
422}
423
424OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
425  switch (Opc) {
426  case PostInc: case PreInc: return OO_PlusPlus;
427  case PostDec: case PreDec: return OO_MinusMinus;
428  case AddrOf: return OO_Amp;
429  case Deref: return OO_Star;
430  case Plus: return OO_Plus;
431  case Minus: return OO_Minus;
432  case Not: return OO_Tilde;
433  case LNot: return OO_Exclaim;
434  default: return OO_None;
435  }
436}
437
438
439//===----------------------------------------------------------------------===//
440// Postfix Operators.
441//===----------------------------------------------------------------------===//
442
443CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, Expr **args,
444                   unsigned numargs, QualType t, SourceLocation rparenloc)
445  : Expr(SC, t,
446         fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs),
447         fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)),
448    NumArgs(numargs) {
449
450  SubExprs = new (C) Stmt*[numargs+1];
451  SubExprs[FN] = fn;
452  for (unsigned i = 0; i != numargs; ++i)
453    SubExprs[i+ARGS_START] = args[i];
454
455  RParenLoc = rparenloc;
456}
457
458CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
459                   QualType t, SourceLocation rparenloc)
460  : Expr(CallExprClass, t,
461         fn->isTypeDependent() || hasAnyTypeDependentArguments(args, numargs),
462         fn->isValueDependent() || hasAnyValueDependentArguments(args,numargs)),
463    NumArgs(numargs) {
464
465  SubExprs = new (C) Stmt*[numargs+1];
466  SubExprs[FN] = fn;
467  for (unsigned i = 0; i != numargs; ++i)
468    SubExprs[i+ARGS_START] = args[i];
469
470  RParenLoc = rparenloc;
471}
472
473CallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
474  : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
475  SubExprs = new (C) Stmt*[1];
476}
477
478void CallExpr::DoDestroy(ASTContext& C) {
479  DestroyChildren(C);
480  if (SubExprs) C.Deallocate(SubExprs);
481  this->~CallExpr();
482  C.Deallocate(this);
483}
484
485Decl *CallExpr::getCalleeDecl() {
486  Expr *CEE = getCallee()->IgnoreParenCasts();
487  if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
488    return DRE->getDecl();
489  if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
490    return ME->getMemberDecl();
491
492  return 0;
493}
494
495FunctionDecl *CallExpr::getDirectCallee() {
496  return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
497}
498
499/// setNumArgs - This changes the number of arguments present in this call.
500/// Any orphaned expressions are deleted by this, and any new operands are set
501/// to null.
502void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
503  // No change, just return.
504  if (NumArgs == getNumArgs()) return;
505
506  // If shrinking # arguments, just delete the extras and forgot them.
507  if (NumArgs < getNumArgs()) {
508    for (unsigned i = NumArgs, e = getNumArgs(); i != e; ++i)
509      getArg(i)->Destroy(C);
510    this->NumArgs = NumArgs;
511    return;
512  }
513
514  // Otherwise, we are growing the # arguments.  New an bigger argument array.
515  Stmt **NewSubExprs = new (C) Stmt*[NumArgs+1];
516  // Copy over args.
517  for (unsigned i = 0; i != getNumArgs()+ARGS_START; ++i)
518    NewSubExprs[i] = SubExprs[i];
519  // Null out new args.
520  for (unsigned i = getNumArgs()+ARGS_START; i != NumArgs+ARGS_START; ++i)
521    NewSubExprs[i] = 0;
522
523  if (SubExprs) C.Deallocate(SubExprs);
524  SubExprs = NewSubExprs;
525  this->NumArgs = NumArgs;
526}
527
528/// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
529/// not, return 0.
530unsigned CallExpr::isBuiltinCall(ASTContext &Context) const {
531  // All simple function calls (e.g. func()) are implicitly cast to pointer to
532  // function. As a result, we try and obtain the DeclRefExpr from the
533  // ImplicitCastExpr.
534  const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
535  if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
536    return 0;
537
538  const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
539  if (!DRE)
540    return 0;
541
542  const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
543  if (!FDecl)
544    return 0;
545
546  if (!FDecl->getIdentifier())
547    return 0;
548
549  return FDecl->getBuiltinID();
550}
551
552QualType CallExpr::getCallReturnType() const {
553  QualType CalleeType = getCallee()->getType();
554  if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
555    CalleeType = FnTypePtr->getPointeeType();
556  else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
557    CalleeType = BPT->getPointeeType();
558
559  const FunctionType *FnType = CalleeType->getAs<FunctionType>();
560  return FnType->getResultType();
561}
562
563OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
564                                   SourceLocation OperatorLoc,
565                                   TypeSourceInfo *tsi,
566                                   OffsetOfNode* compsPtr, unsigned numComps,
567                                   Expr** exprsPtr, unsigned numExprs,
568                                   SourceLocation RParenLoc) {
569  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
570                         sizeof(OffsetOfNode) * numComps +
571                         sizeof(Expr*) * numExprs);
572
573  return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
574                                exprsPtr, numExprs, RParenLoc);
575}
576
577OffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
578                                        unsigned numComps, unsigned numExprs) {
579  void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
580                         sizeof(OffsetOfNode) * numComps +
581                         sizeof(Expr*) * numExprs);
582  return new (Mem) OffsetOfExpr(numComps, numExprs);
583}
584
585OffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
586                           SourceLocation OperatorLoc, TypeSourceInfo *tsi,
587                           OffsetOfNode* compsPtr, unsigned numComps,
588                           Expr** exprsPtr, unsigned numExprs,
589                           SourceLocation RParenLoc)
590  : Expr(OffsetOfExprClass, type, /*TypeDependent=*/false,
591         /*ValueDependent=*/tsi->getType()->isDependentType() ||
592         hasAnyTypeDependentArguments(exprsPtr, numExprs) ||
593         hasAnyValueDependentArguments(exprsPtr, numExprs)),
594    OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
595    NumComps(numComps), NumExprs(numExprs)
596{
597  for(unsigned i = 0; i < numComps; ++i) {
598    setComponent(i, compsPtr[i]);
599  }
600
601  for(unsigned i = 0; i < numExprs; ++i) {
602    setIndexExpr(i, exprsPtr[i]);
603  }
604}
605
606IdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
607  assert(getKind() == Field || getKind() == Identifier);
608  if (getKind() == Field)
609    return getField()->getIdentifier();
610
611  return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
612}
613
614MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
615                               NestedNameSpecifier *qual,
616                               SourceRange qualrange,
617                               ValueDecl *memberdecl,
618                               DeclAccessPair founddecl,
619                               SourceLocation l,
620                               const TemplateArgumentListInfo *targs,
621                               QualType ty) {
622  std::size_t Size = sizeof(MemberExpr);
623
624  bool hasQualOrFound = (qual != 0 ||
625                         founddecl.getDecl() != memberdecl ||
626                         founddecl.getAccess() != memberdecl->getAccess());
627  if (hasQualOrFound)
628    Size += sizeof(MemberNameQualifier);
629
630  if (targs)
631    Size += ExplicitTemplateArgumentList::sizeFor(*targs);
632
633  void *Mem = C.Allocate(Size, llvm::alignof<MemberExpr>());
634  MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, l, ty);
635
636  if (hasQualOrFound) {
637    if (qual && qual->isDependent()) {
638      E->setValueDependent(true);
639      E->setTypeDependent(true);
640    }
641    E->HasQualifierOrFoundDecl = true;
642
643    MemberNameQualifier *NQ = E->getMemberQualifier();
644    NQ->NNS = qual;
645    NQ->Range = qualrange;
646    NQ->FoundDecl = founddecl;
647  }
648
649  if (targs) {
650    E->HasExplicitTemplateArgumentList = true;
651    E->getExplicitTemplateArgumentList()->initializeFrom(*targs);
652  }
653
654  return E;
655}
656
657const char *CastExpr::getCastKindName() const {
658  switch (getCastKind()) {
659  case CastExpr::CK_Unknown:
660    return "Unknown";
661  case CastExpr::CK_BitCast:
662    return "BitCast";
663  case CastExpr::CK_NoOp:
664    return "NoOp";
665  case CastExpr::CK_BaseToDerived:
666    return "BaseToDerived";
667  case CastExpr::CK_DerivedToBase:
668    return "DerivedToBase";
669  case CastExpr::CK_UncheckedDerivedToBase:
670    return "UncheckedDerivedToBase";
671  case CastExpr::CK_Dynamic:
672    return "Dynamic";
673  case CastExpr::CK_ToUnion:
674    return "ToUnion";
675  case CastExpr::CK_ArrayToPointerDecay:
676    return "ArrayToPointerDecay";
677  case CastExpr::CK_FunctionToPointerDecay:
678    return "FunctionToPointerDecay";
679  case CastExpr::CK_NullToMemberPointer:
680    return "NullToMemberPointer";
681  case CastExpr::CK_BaseToDerivedMemberPointer:
682    return "BaseToDerivedMemberPointer";
683  case CastExpr::CK_DerivedToBaseMemberPointer:
684    return "DerivedToBaseMemberPointer";
685  case CastExpr::CK_UserDefinedConversion:
686    return "UserDefinedConversion";
687  case CastExpr::CK_ConstructorConversion:
688    return "ConstructorConversion";
689  case CastExpr::CK_IntegralToPointer:
690    return "IntegralToPointer";
691  case CastExpr::CK_PointerToIntegral:
692    return "PointerToIntegral";
693  case CastExpr::CK_ToVoid:
694    return "ToVoid";
695  case CastExpr::CK_VectorSplat:
696    return "VectorSplat";
697  case CastExpr::CK_IntegralCast:
698    return "IntegralCast";
699  case CastExpr::CK_IntegralToFloating:
700    return "IntegralToFloating";
701  case CastExpr::CK_FloatingToIntegral:
702    return "FloatingToIntegral";
703  case CastExpr::CK_FloatingCast:
704    return "FloatingCast";
705  case CastExpr::CK_MemberPointerToBoolean:
706    return "MemberPointerToBoolean";
707  case CastExpr::CK_AnyPointerToObjCPointerCast:
708    return "AnyPointerToObjCPointerCast";
709  case CastExpr::CK_AnyPointerToBlockPointerCast:
710    return "AnyPointerToBlockPointerCast";
711  }
712
713  assert(0 && "Unhandled cast kind!");
714  return 0;
715}
716
717void CastExpr::DoDestroy(ASTContext &C)
718{
719  BasePath.Destroy();
720  Expr::DoDestroy(C);
721}
722
723Expr *CastExpr::getSubExprAsWritten() {
724  Expr *SubExpr = 0;
725  CastExpr *E = this;
726  do {
727    SubExpr = E->getSubExpr();
728
729    // Skip any temporary bindings; they're implicit.
730    if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
731      SubExpr = Binder->getSubExpr();
732
733    // Conversions by constructor and conversion functions have a
734    // subexpression describing the call; strip it off.
735    if (E->getCastKind() == CastExpr::CK_ConstructorConversion)
736      SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
737    else if (E->getCastKind() == CastExpr::CK_UserDefinedConversion)
738      SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
739
740    // If the subexpression we're left with is an implicit cast, look
741    // through that, too.
742  } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
743
744  return SubExpr;
745}
746
747/// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
748/// corresponds to, e.g. "<<=".
749const char *BinaryOperator::getOpcodeStr(Opcode Op) {
750  switch (Op) {
751  case PtrMemD:   return ".*";
752  case PtrMemI:   return "->*";
753  case Mul:       return "*";
754  case Div:       return "/";
755  case Rem:       return "%";
756  case Add:       return "+";
757  case Sub:       return "-";
758  case Shl:       return "<<";
759  case Shr:       return ">>";
760  case LT:        return "<";
761  case GT:        return ">";
762  case LE:        return "<=";
763  case GE:        return ">=";
764  case EQ:        return "==";
765  case NE:        return "!=";
766  case And:       return "&";
767  case Xor:       return "^";
768  case Or:        return "|";
769  case LAnd:      return "&&";
770  case LOr:       return "||";
771  case Assign:    return "=";
772  case MulAssign: return "*=";
773  case DivAssign: return "/=";
774  case RemAssign: return "%=";
775  case AddAssign: return "+=";
776  case SubAssign: return "-=";
777  case ShlAssign: return "<<=";
778  case ShrAssign: return ">>=";
779  case AndAssign: return "&=";
780  case XorAssign: return "^=";
781  case OrAssign:  return "|=";
782  case Comma:     return ",";
783  }
784
785  return "";
786}
787
788BinaryOperator::Opcode
789BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
790  switch (OO) {
791  default: assert(false && "Not an overloadable binary operator");
792  case OO_Plus: return Add;
793  case OO_Minus: return Sub;
794  case OO_Star: return Mul;
795  case OO_Slash: return Div;
796  case OO_Percent: return Rem;
797  case OO_Caret: return Xor;
798  case OO_Amp: return And;
799  case OO_Pipe: return Or;
800  case OO_Equal: return Assign;
801  case OO_Less: return LT;
802  case OO_Greater: return GT;
803  case OO_PlusEqual: return AddAssign;
804  case OO_MinusEqual: return SubAssign;
805  case OO_StarEqual: return MulAssign;
806  case OO_SlashEqual: return DivAssign;
807  case OO_PercentEqual: return RemAssign;
808  case OO_CaretEqual: return XorAssign;
809  case OO_AmpEqual: return AndAssign;
810  case OO_PipeEqual: return OrAssign;
811  case OO_LessLess: return Shl;
812  case OO_GreaterGreater: return Shr;
813  case OO_LessLessEqual: return ShlAssign;
814  case OO_GreaterGreaterEqual: return ShrAssign;
815  case OO_EqualEqual: return EQ;
816  case OO_ExclaimEqual: return NE;
817  case OO_LessEqual: return LE;
818  case OO_GreaterEqual: return GE;
819  case OO_AmpAmp: return LAnd;
820  case OO_PipePipe: return LOr;
821  case OO_Comma: return Comma;
822  case OO_ArrowStar: return PtrMemI;
823  }
824}
825
826OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
827  static const OverloadedOperatorKind OverOps[] = {
828    /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
829    OO_Star, OO_Slash, OO_Percent,
830    OO_Plus, OO_Minus,
831    OO_LessLess, OO_GreaterGreater,
832    OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
833    OO_EqualEqual, OO_ExclaimEqual,
834    OO_Amp,
835    OO_Caret,
836    OO_Pipe,
837    OO_AmpAmp,
838    OO_PipePipe,
839    OO_Equal, OO_StarEqual,
840    OO_SlashEqual, OO_PercentEqual,
841    OO_PlusEqual, OO_MinusEqual,
842    OO_LessLessEqual, OO_GreaterGreaterEqual,
843    OO_AmpEqual, OO_CaretEqual,
844    OO_PipeEqual,
845    OO_Comma
846  };
847  return OverOps[Opc];
848}
849
850InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
851                           Expr **initExprs, unsigned numInits,
852                           SourceLocation rbraceloc)
853  : Expr(InitListExprClass, QualType(), false, false),
854    InitExprs(C, numInits),
855    LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0),
856    UnionFieldInit(0), HadArrayRangeDesignator(false)
857{
858  for (unsigned I = 0; I != numInits; ++I) {
859    if (initExprs[I]->isTypeDependent())
860      TypeDependent = true;
861    if (initExprs[I]->isValueDependent())
862      ValueDependent = true;
863  }
864
865  InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
866}
867
868void InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
869  if (NumInits > InitExprs.size())
870    InitExprs.reserve(C, NumInits);
871}
872
873void InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
874  for (unsigned Idx = NumInits, LastIdx = InitExprs.size();
875       Idx < LastIdx; ++Idx)
876    InitExprs[Idx]->Destroy(C);
877  InitExprs.resize(C, NumInits, 0);
878}
879
880Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
881  if (Init >= InitExprs.size()) {
882    InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
883    InitExprs.back() = expr;
884    return 0;
885  }
886
887  Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
888  InitExprs[Init] = expr;
889  return Result;
890}
891
892/// getFunctionType - Return the underlying function type for this block.
893///
894const FunctionType *BlockExpr::getFunctionType() const {
895  return getType()->getAs<BlockPointerType>()->
896                    getPointeeType()->getAs<FunctionType>();
897}
898
899SourceLocation BlockExpr::getCaretLocation() const {
900  return TheBlock->getCaretLocation();
901}
902const Stmt *BlockExpr::getBody() const {
903  return TheBlock->getBody();
904}
905Stmt *BlockExpr::getBody() {
906  return TheBlock->getBody();
907}
908
909
910//===----------------------------------------------------------------------===//
911// Generic Expression Routines
912//===----------------------------------------------------------------------===//
913
914/// isUnusedResultAWarning - Return true if this immediate expression should
915/// be warned about if the result is unused.  If so, fill in Loc and Ranges
916/// with location to warn on and the source range[s] to report with the
917/// warning.
918bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
919                                  SourceRange &R2, ASTContext &Ctx) const {
920  // Don't warn if the expr is type dependent. The type could end up
921  // instantiating to void.
922  if (isTypeDependent())
923    return false;
924
925  switch (getStmtClass()) {
926  default:
927    if (getType()->isVoidType())
928      return false;
929    Loc = getExprLoc();
930    R1 = getSourceRange();
931    return true;
932  case ParenExprClass:
933    return cast<ParenExpr>(this)->getSubExpr()->
934      isUnusedResultAWarning(Loc, R1, R2, Ctx);
935  case UnaryOperatorClass: {
936    const UnaryOperator *UO = cast<UnaryOperator>(this);
937
938    switch (UO->getOpcode()) {
939    default: break;
940    case UnaryOperator::PostInc:
941    case UnaryOperator::PostDec:
942    case UnaryOperator::PreInc:
943    case UnaryOperator::PreDec:                 // ++/--
944      return false;  // Not a warning.
945    case UnaryOperator::Deref:
946      // Dereferencing a volatile pointer is a side-effect.
947      if (Ctx.getCanonicalType(getType()).isVolatileQualified())
948        return false;
949      break;
950    case UnaryOperator::Real:
951    case UnaryOperator::Imag:
952      // accessing a piece of a volatile complex is a side-effect.
953      if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
954          .isVolatileQualified())
955        return false;
956      break;
957    case UnaryOperator::Extension:
958      return UO->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
959    }
960    Loc = UO->getOperatorLoc();
961    R1 = UO->getSubExpr()->getSourceRange();
962    return true;
963  }
964  case BinaryOperatorClass: {
965    const BinaryOperator *BO = cast<BinaryOperator>(this);
966    switch (BO->getOpcode()) {
967      default:
968        break;
969      // Consider ',', '||', '&&' to have side effects if the LHS or RHS does.
970      case BinaryOperator::Comma:
971        // ((foo = <blah>), 0) is an idiom for hiding the result (and
972        // lvalue-ness) of an assignment written in a macro.
973        if (IntegerLiteral *IE =
974              dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
975          if (IE->getValue() == 0)
976            return false;
977      case BinaryOperator::LAnd:
978      case BinaryOperator::LOr:
979        return (BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
980                BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
981    }
982    if (BO->isAssignmentOp())
983      return false;
984    Loc = BO->getOperatorLoc();
985    R1 = BO->getLHS()->getSourceRange();
986    R2 = BO->getRHS()->getSourceRange();
987    return true;
988  }
989  case CompoundAssignOperatorClass:
990  case VAArgExprClass:
991    return false;
992
993  case ConditionalOperatorClass: {
994    // The condition must be evaluated, but if either the LHS or RHS is a
995    // warning, warn about them.
996    const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
997    if (Exp->getLHS() &&
998        Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
999      return true;
1000    return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1001  }
1002
1003  case MemberExprClass:
1004    // If the base pointer or element is to a volatile pointer/field, accessing
1005    // it is a side effect.
1006    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1007      return false;
1008    Loc = cast<MemberExpr>(this)->getMemberLoc();
1009    R1 = SourceRange(Loc, Loc);
1010    R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1011    return true;
1012
1013  case ArraySubscriptExprClass:
1014    // If the base pointer or element is to a volatile pointer/field, accessing
1015    // it is a side effect.
1016    if (Ctx.getCanonicalType(getType()).isVolatileQualified())
1017      return false;
1018    Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1019    R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1020    R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1021    return true;
1022
1023  case CallExprClass:
1024  case CXXOperatorCallExprClass:
1025  case CXXMemberCallExprClass: {
1026    // If this is a direct call, get the callee.
1027    const CallExpr *CE = cast<CallExpr>(this);
1028    if (const Decl *FD = CE->getCalleeDecl()) {
1029      // If the callee has attribute pure, const, or warn_unused_result, warn
1030      // about it. void foo() { strlen("bar"); } should warn.
1031      //
1032      // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1033      // updated to match for QoI.
1034      if (FD->getAttr<WarnUnusedResultAttr>() ||
1035          FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1036        Loc = CE->getCallee()->getLocStart();
1037        R1 = CE->getCallee()->getSourceRange();
1038
1039        if (unsigned NumArgs = CE->getNumArgs())
1040          R2 = SourceRange(CE->getArg(0)->getLocStart(),
1041                           CE->getArg(NumArgs-1)->getLocEnd());
1042        return true;
1043      }
1044    }
1045    return false;
1046  }
1047
1048  case CXXTemporaryObjectExprClass:
1049  case CXXConstructExprClass:
1050    return false;
1051
1052  case ObjCMessageExprClass: {
1053    const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1054    const ObjCMethodDecl *MD = ME->getMethodDecl();
1055    if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1056      Loc = getExprLoc();
1057      return true;
1058    }
1059    return false;
1060  }
1061
1062  case ObjCImplicitSetterGetterRefExprClass: {   // Dot syntax for message send.
1063#if 0
1064    const ObjCImplicitSetterGetterRefExpr *Ref =
1065      cast<ObjCImplicitSetterGetterRefExpr>(this);
1066    // FIXME: We really want the location of the '.' here.
1067    Loc = Ref->getLocation();
1068    R1 = SourceRange(Ref->getLocation(), Ref->getLocation());
1069    if (Ref->getBase())
1070      R2 = Ref->getBase()->getSourceRange();
1071#else
1072    Loc = getExprLoc();
1073    R1 = getSourceRange();
1074#endif
1075    return true;
1076  }
1077  case StmtExprClass: {
1078    // Statement exprs don't logically have side effects themselves, but are
1079    // sometimes used in macros in ways that give them a type that is unused.
1080    // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1081    // however, if the result of the stmt expr is dead, we don't want to emit a
1082    // warning.
1083    const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1084    if (!CS->body_empty())
1085      if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1086        return E->isUnusedResultAWarning(Loc, R1, R2, Ctx);
1087
1088    if (getType()->isVoidType())
1089      return false;
1090    Loc = cast<StmtExpr>(this)->getLParenLoc();
1091    R1 = getSourceRange();
1092    return true;
1093  }
1094  case CStyleCastExprClass:
1095    // If this is an explicit cast to void, allow it.  People do this when they
1096    // think they know what they're doing :).
1097    if (getType()->isVoidType())
1098      return false;
1099    Loc = cast<CStyleCastExpr>(this)->getLParenLoc();
1100    R1 = cast<CStyleCastExpr>(this)->getSubExpr()->getSourceRange();
1101    return true;
1102  case CXXFunctionalCastExprClass: {
1103    if (getType()->isVoidType())
1104      return false;
1105    const CastExpr *CE = cast<CastExpr>(this);
1106
1107    // If this is a cast to void or a constructor conversion, check the operand.
1108    // Otherwise, the result of the cast is unused.
1109    if (CE->getCastKind() == CastExpr::CK_ToVoid ||
1110        CE->getCastKind() == CastExpr::CK_ConstructorConversion)
1111      return (cast<CastExpr>(this)->getSubExpr()
1112              ->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1113    Loc = cast<CXXFunctionalCastExpr>(this)->getTypeBeginLoc();
1114    R1 = cast<CXXFunctionalCastExpr>(this)->getSubExpr()->getSourceRange();
1115    return true;
1116  }
1117
1118  case ImplicitCastExprClass:
1119    // Check the operand, since implicit casts are inserted by Sema
1120    return (cast<ImplicitCastExpr>(this)
1121            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1122
1123  case CXXDefaultArgExprClass:
1124    return (cast<CXXDefaultArgExpr>(this)
1125            ->getExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1126
1127  case CXXNewExprClass:
1128    // FIXME: In theory, there might be new expressions that don't have side
1129    // effects (e.g. a placement new with an uninitialized POD).
1130  case CXXDeleteExprClass:
1131    return false;
1132  case CXXBindTemporaryExprClass:
1133    return (cast<CXXBindTemporaryExpr>(this)
1134            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1135  case CXXExprWithTemporariesClass:
1136    return (cast<CXXExprWithTemporaries>(this)
1137            ->getSubExpr()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
1138  }
1139}
1140
1141/// DeclCanBeLvalue - Determine whether the given declaration can be
1142/// an lvalue. This is a helper routine for isLvalue.
1143static bool DeclCanBeLvalue(const NamedDecl *Decl, ASTContext &Ctx) {
1144  // C++ [temp.param]p6:
1145  //   A non-type non-reference template-parameter is not an lvalue.
1146  if (const NonTypeTemplateParmDecl *NTTParm
1147        = dyn_cast<NonTypeTemplateParmDecl>(Decl))
1148    return NTTParm->getType()->isReferenceType();
1149
1150  return isa<VarDecl>(Decl) || isa<FieldDecl>(Decl) ||
1151    // C++ 3.10p2: An lvalue refers to an object or function.
1152    (Ctx.getLangOptions().CPlusPlus &&
1153     (isa<FunctionDecl>(Decl) || isa<FunctionTemplateDecl>(Decl)));
1154}
1155
1156/// isLvalue - C99 6.3.2.1: an lvalue is an expression with an object type or an
1157/// incomplete type other than void. Nonarray expressions that can be lvalues:
1158///  - name, where name must be a variable
1159///  - e[i]
1160///  - (e), where e must be an lvalue
1161///  - e.name, where e must be an lvalue
1162///  - e->name
1163///  - *e, the type of e cannot be a function type
1164///  - string-constant
1165///  - (__real__ e) and (__imag__ e) where e is an lvalue  [GNU extension]
1166///  - reference type [C++ [expr]]
1167///
1168Expr::isLvalueResult Expr::isLvalue(ASTContext &Ctx) const {
1169  assert(!TR->isReferenceType() && "Expressions can't have reference type.");
1170
1171  isLvalueResult Res = isLvalueInternal(Ctx);
1172  if (Res != LV_Valid || Ctx.getLangOptions().CPlusPlus)
1173    return Res;
1174
1175  // first, check the type (C99 6.3.2.1). Expressions with function
1176  // type in C are not lvalues, but they can be lvalues in C++.
1177  if (TR->isFunctionType() || TR == Ctx.OverloadTy)
1178    return LV_NotObjectType;
1179
1180  // Allow qualified void which is an incomplete type other than void (yuck).
1181  if (TR->isVoidType() && !Ctx.getCanonicalType(TR).hasQualifiers())
1182    return LV_IncompleteVoidType;
1183
1184  return LV_Valid;
1185}
1186
1187// Check whether the expression can be sanely treated like an l-value
1188Expr::isLvalueResult Expr::isLvalueInternal(ASTContext &Ctx) const {
1189  switch (getStmtClass()) {
1190  case ObjCIsaExprClass:
1191  case StringLiteralClass:  // C99 6.5.1p4
1192  case ObjCEncodeExprClass: // @encode behaves like its string in every way.
1193    return LV_Valid;
1194  case ArraySubscriptExprClass: // C99 6.5.3p4 (e1[e2] == (*((e1)+(e2))))
1195    // For vectors, make sure base is an lvalue (i.e. not a function call).
1196    if (cast<ArraySubscriptExpr>(this)->getBase()->getType()->isVectorType())
1197      return cast<ArraySubscriptExpr>(this)->getBase()->isLvalue(Ctx);
1198    return LV_Valid;
1199  case DeclRefExprClass: { // C99 6.5.1p2
1200    const NamedDecl *RefdDecl = cast<DeclRefExpr>(this)->getDecl();
1201    if (DeclCanBeLvalue(RefdDecl, Ctx))
1202      return LV_Valid;
1203    break;
1204  }
1205  case BlockDeclRefExprClass: {
1206    const BlockDeclRefExpr *BDR = cast<BlockDeclRefExpr>(this);
1207    if (isa<VarDecl>(BDR->getDecl()))
1208      return LV_Valid;
1209    break;
1210  }
1211  case MemberExprClass: {
1212    const MemberExpr *m = cast<MemberExpr>(this);
1213    if (Ctx.getLangOptions().CPlusPlus) { // C++ [expr.ref]p4:
1214      NamedDecl *Member = m->getMemberDecl();
1215      // C++ [expr.ref]p4:
1216      //   If E2 is declared to have type "reference to T", then E1.E2
1217      //   is an lvalue.
1218      if (ValueDecl *Value = dyn_cast<ValueDecl>(Member))
1219        if (Value->getType()->isReferenceType())
1220          return LV_Valid;
1221
1222      //   -- If E2 is a static data member [...] then E1.E2 is an lvalue.
1223      if (isa<VarDecl>(Member) && Member->getDeclContext()->isRecord())
1224        return LV_Valid;
1225
1226      //   -- If E2 is a non-static data member [...]. If E1 is an
1227      //      lvalue, then E1.E2 is an lvalue.
1228      if (isa<FieldDecl>(Member)) {
1229        if (m->isArrow())
1230          return LV_Valid;
1231        return m->getBase()->isLvalue(Ctx);
1232      }
1233
1234      //   -- If it refers to a static member function [...], then
1235      //      E1.E2 is an lvalue.
1236      //   -- Otherwise, if E1.E2 refers to a non-static member
1237      //      function [...], then E1.E2 is not an lvalue.
1238      if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Member))
1239        return Method->isStatic()? LV_Valid : LV_MemberFunction;
1240
1241      //   -- If E2 is a member enumerator [...], the expression E1.E2
1242      //      is not an lvalue.
1243      if (isa<EnumConstantDecl>(Member))
1244        return LV_InvalidExpression;
1245
1246        // Not an lvalue.
1247      return LV_InvalidExpression;
1248    }
1249
1250    // C99 6.5.2.3p4
1251    if (m->isArrow())
1252      return LV_Valid;
1253    Expr *BaseExp = m->getBase();
1254    if (BaseExp->getStmtClass() == ObjCPropertyRefExprClass ||
1255        BaseExp->getStmtClass() == ObjCImplicitSetterGetterRefExprClass)
1256          return LV_SubObjCPropertySetting;
1257    return
1258       BaseExp->isLvalue(Ctx);
1259  }
1260  case UnaryOperatorClass:
1261    if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Deref)
1262      return LV_Valid; // C99 6.5.3p4
1263
1264    if (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Real ||
1265        cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Imag ||
1266        cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::Extension)
1267      return cast<UnaryOperator>(this)->getSubExpr()->isLvalue(Ctx);  // GNU.
1268
1269    if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.pre.incr]p1
1270        (cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreInc ||
1271         cast<UnaryOperator>(this)->getOpcode() == UnaryOperator::PreDec))
1272      return LV_Valid;
1273    break;
1274  case ImplicitCastExprClass:
1275    if (cast<ImplicitCastExpr>(this)->isLvalueCast())
1276      return LV_Valid;
1277
1278    // If this is a conversion to a class temporary, make a note of
1279    // that.
1280    if (Ctx.getLangOptions().CPlusPlus && getType()->isRecordType())
1281      return LV_ClassTemporary;
1282
1283    break;
1284  case ParenExprClass: // C99 6.5.1p5
1285    return cast<ParenExpr>(this)->getSubExpr()->isLvalue(Ctx);
1286  case BinaryOperatorClass:
1287  case CompoundAssignOperatorClass: {
1288    const BinaryOperator *BinOp = cast<BinaryOperator>(this);
1289
1290    if (Ctx.getLangOptions().CPlusPlus && // C++ [expr.comma]p1
1291        BinOp->getOpcode() == BinaryOperator::Comma)
1292      return BinOp->getRHS()->isLvalue(Ctx);
1293
1294    // C++ [expr.mptr.oper]p6
1295    // The result of a .* expression is an lvalue only if its first operand is
1296    // an lvalue and its second operand is a pointer to data member.
1297    if (BinOp->getOpcode() == BinaryOperator::PtrMemD &&
1298        !BinOp->getType()->isFunctionType())
1299      return BinOp->getLHS()->isLvalue(Ctx);
1300
1301    // The result of an ->* expression is an lvalue only if its second operand
1302    // is a pointer to data member.
1303    if (BinOp->getOpcode() == BinaryOperator::PtrMemI &&
1304        !BinOp->getType()->isFunctionType()) {
1305      QualType Ty = BinOp->getRHS()->getType();
1306      if (Ty->isMemberPointerType() && !Ty->isMemberFunctionPointerType())
1307        return LV_Valid;
1308    }
1309
1310    if (!BinOp->isAssignmentOp())
1311      return LV_InvalidExpression;
1312
1313    if (Ctx.getLangOptions().CPlusPlus)
1314      // C++ [expr.ass]p1:
1315      //   The result of an assignment operation [...] is an lvalue.
1316      return LV_Valid;
1317
1318
1319    // C99 6.5.16:
1320    //   An assignment expression [...] is not an lvalue.
1321    return LV_InvalidExpression;
1322  }
1323  case CallExprClass:
1324  case CXXOperatorCallExprClass:
1325  case CXXMemberCallExprClass: {
1326    // C++0x [expr.call]p10
1327    //   A function call is an lvalue if and only if the result type
1328    //   is an lvalue reference.
1329    QualType ReturnType = cast<CallExpr>(this)->getCallReturnType();
1330    if (ReturnType->isLValueReferenceType())
1331      return LV_Valid;
1332
1333    // If the function is returning a class temporary, make a note of
1334    // that.
1335    if (Ctx.getLangOptions().CPlusPlus && ReturnType->isRecordType())
1336      return LV_ClassTemporary;
1337
1338    break;
1339  }
1340  case CompoundLiteralExprClass: // C99 6.5.2.5p5
1341    // FIXME: Is this what we want in C++?
1342    return LV_Valid;
1343  case ChooseExprClass:
1344    // __builtin_choose_expr is an lvalue if the selected operand is.
1345    return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)->isLvalue(Ctx);
1346  case ExtVectorElementExprClass:
1347    if (cast<ExtVectorElementExpr>(this)->containsDuplicateElements())
1348      return LV_DuplicateVectorComponents;
1349    return LV_Valid;
1350  case ObjCIvarRefExprClass: // ObjC instance variables are lvalues.
1351    return LV_Valid;
1352  case ObjCPropertyRefExprClass: // FIXME: check if read-only property.
1353    return LV_Valid;
1354  case ObjCImplicitSetterGetterRefExprClass:
1355    // FIXME: check if read-only property.
1356    return LV_Valid;
1357  case PredefinedExprClass:
1358    return LV_Valid;
1359  case UnresolvedLookupExprClass:
1360  case UnresolvedMemberExprClass:
1361    return LV_Valid;
1362  case CXXDefaultArgExprClass:
1363    return cast<CXXDefaultArgExpr>(this)->getExpr()->isLvalue(Ctx);
1364  case CStyleCastExprClass:
1365  case CXXFunctionalCastExprClass:
1366  case CXXStaticCastExprClass:
1367  case CXXDynamicCastExprClass:
1368  case CXXReinterpretCastExprClass:
1369  case CXXConstCastExprClass:
1370    // The result of an explicit cast is an lvalue if the type we are
1371    // casting to is an lvalue reference type. See C++ [expr.cast]p1,
1372    // C++ [expr.static.cast]p2, C++ [expr.dynamic.cast]p2,
1373    // C++ [expr.reinterpret.cast]p1, C++ [expr.const.cast]p1.
1374    if (cast<ExplicitCastExpr>(this)->getTypeAsWritten()->
1375          isLValueReferenceType())
1376      return LV_Valid;
1377
1378    // If this is a conversion to a class temporary, make a note of
1379    // that.
1380    if (Ctx.getLangOptions().CPlusPlus &&
1381        cast<ExplicitCastExpr>(this)->getTypeAsWritten()->isRecordType())
1382      return LV_ClassTemporary;
1383
1384    break;
1385  case CXXTypeidExprClass:
1386    // C++ 5.2.8p1: The result of a typeid expression is an lvalue of ...
1387    return LV_Valid;
1388  case CXXBindTemporaryExprClass:
1389    return cast<CXXBindTemporaryExpr>(this)->getSubExpr()->
1390      isLvalueInternal(Ctx);
1391  case CXXBindReferenceExprClass:
1392    // Something that's bound to a reference is always an lvalue.
1393    return LV_Valid;
1394  case ConditionalOperatorClass: {
1395    // Complicated handling is only for C++.
1396    if (!Ctx.getLangOptions().CPlusPlus)
1397      return LV_InvalidExpression;
1398
1399    // Sema should have taken care to ensure that a CXXTemporaryObjectExpr is
1400    // everywhere there's an object converted to an rvalue. Also, any other
1401    // casts should be wrapped by ImplicitCastExprs. There's just the special
1402    // case involving throws to work out.
1403    const ConditionalOperator *Cond = cast<ConditionalOperator>(this);
1404    Expr *True = Cond->getTrueExpr();
1405    Expr *False = Cond->getFalseExpr();
1406    // C++0x 5.16p2
1407    //   If either the second or the third operand has type (cv) void, [...]
1408    //   the result [...] is an rvalue.
1409    if (True->getType()->isVoidType() || False->getType()->isVoidType())
1410      return LV_InvalidExpression;
1411
1412    // Both sides must be lvalues for the result to be an lvalue.
1413    if (True->isLvalue(Ctx) != LV_Valid || False->isLvalue(Ctx) != LV_Valid)
1414      return LV_InvalidExpression;
1415
1416    // That's it.
1417    return LV_Valid;
1418  }
1419
1420  case Expr::CXXExprWithTemporariesClass:
1421    return cast<CXXExprWithTemporaries>(this)->getSubExpr()->isLvalue(Ctx);
1422
1423  case Expr::ObjCMessageExprClass:
1424    if (const ObjCMethodDecl *Method
1425          = cast<ObjCMessageExpr>(this)->getMethodDecl())
1426      if (Method->getResultType()->isLValueReferenceType())
1427        return LV_Valid;
1428    break;
1429
1430  case Expr::CXXConstructExprClass:
1431  case Expr::CXXTemporaryObjectExprClass:
1432  case Expr::CXXZeroInitValueExprClass:
1433    return LV_ClassTemporary;
1434
1435  default:
1436    break;
1437  }
1438  return LV_InvalidExpression;
1439}
1440
1441/// isModifiableLvalue - C99 6.3.2.1: an lvalue that does not have array type,
1442/// does not have an incomplete type, does not have a const-qualified type, and
1443/// if it is a structure or union, does not have any member (including,
1444/// recursively, any member or element of all contained aggregates or unions)
1445/// with a const-qualified type.
1446Expr::isModifiableLvalueResult
1447Expr::isModifiableLvalue(ASTContext &Ctx, SourceLocation *Loc) const {
1448  isLvalueResult lvalResult = isLvalue(Ctx);
1449
1450  switch (lvalResult) {
1451  case LV_Valid:
1452    // C++ 3.10p11: Functions cannot be modified, but pointers to
1453    // functions can be modifiable.
1454    if (Ctx.getLangOptions().CPlusPlus && TR->isFunctionType())
1455      return MLV_NotObjectType;
1456    break;
1457
1458  case LV_NotObjectType: return MLV_NotObjectType;
1459  case LV_IncompleteVoidType: return MLV_IncompleteVoidType;
1460  case LV_DuplicateVectorComponents: return MLV_DuplicateVectorComponents;
1461  case LV_InvalidExpression:
1462    // If the top level is a C-style cast, and the subexpression is a valid
1463    // lvalue, then this is probably a use of the old-school "cast as lvalue"
1464    // GCC extension.  We don't support it, but we want to produce good
1465    // diagnostics when it happens so that the user knows why.
1466    if (const CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(IgnoreParens())) {
1467      if (CE->getSubExpr()->isLvalue(Ctx) == LV_Valid) {
1468        if (Loc)
1469          *Loc = CE->getLParenLoc();
1470        return MLV_LValueCast;
1471      }
1472    }
1473    return MLV_InvalidExpression;
1474  case LV_MemberFunction: return MLV_MemberFunction;
1475  case LV_SubObjCPropertySetting: return MLV_SubObjCPropertySetting;
1476  case LV_ClassTemporary:
1477    return MLV_ClassTemporary;
1478  }
1479
1480  // The following is illegal:
1481  //   void takeclosure(void (^C)(void));
1482  //   void func() { int x = 1; takeclosure(^{ x = 7; }); }
1483  //
1484  if (const BlockDeclRefExpr *BDR = dyn_cast<BlockDeclRefExpr>(this)) {
1485    if (!BDR->isByRef() && isa<VarDecl>(BDR->getDecl()))
1486      return MLV_NotBlockQualified;
1487  }
1488
1489  // Assigning to an 'implicit' property?
1490  if (const ObjCImplicitSetterGetterRefExpr* Expr =
1491        dyn_cast<ObjCImplicitSetterGetterRefExpr>(this)) {
1492    if (Expr->getSetterMethod() == 0)
1493      return MLV_NoSetterProperty;
1494  }
1495
1496  QualType CT = Ctx.getCanonicalType(getType());
1497
1498  if (CT.isConstQualified())
1499    return MLV_ConstQualified;
1500  if (CT->isArrayType())
1501    return MLV_ArrayType;
1502  if (CT->isIncompleteType())
1503    return MLV_IncompleteType;
1504
1505  if (const RecordType *r = CT->getAs<RecordType>()) {
1506    if (r->hasConstFields())
1507      return MLV_ConstQualified;
1508  }
1509
1510  return MLV_Valid;
1511}
1512
1513/// isOBJCGCCandidate - Check if an expression is objc gc'able.
1514/// returns true, if it is; false otherwise.
1515bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
1516  switch (getStmtClass()) {
1517  default:
1518    return false;
1519  case ObjCIvarRefExprClass:
1520    return true;
1521  case Expr::UnaryOperatorClass:
1522    return cast<UnaryOperator>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1523  case ParenExprClass:
1524    return cast<ParenExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1525  case ImplicitCastExprClass:
1526    return cast<ImplicitCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1527  case CStyleCastExprClass:
1528    return cast<CStyleCastExpr>(this)->getSubExpr()->isOBJCGCCandidate(Ctx);
1529  case DeclRefExprClass: {
1530    const Decl *D = cast<DeclRefExpr>(this)->getDecl();
1531    if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1532      if (VD->hasGlobalStorage())
1533        return true;
1534      QualType T = VD->getType();
1535      // dereferencing to a  pointer is always a gc'able candidate,
1536      // unless it is __weak.
1537      return T->isPointerType() &&
1538             (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1539    }
1540    return false;
1541  }
1542  case MemberExprClass: {
1543    const MemberExpr *M = cast<MemberExpr>(this);
1544    return M->getBase()->isOBJCGCCandidate(Ctx);
1545  }
1546  case ArraySubscriptExprClass:
1547    return cast<ArraySubscriptExpr>(this)->getBase()->isOBJCGCCandidate(Ctx);
1548  }
1549}
1550Expr* Expr::IgnoreParens() {
1551  Expr* E = this;
1552  while (ParenExpr* P = dyn_cast<ParenExpr>(E))
1553    E = P->getSubExpr();
1554
1555  return E;
1556}
1557
1558/// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
1559/// or CastExprs or ImplicitCastExprs, returning their operand.
1560Expr *Expr::IgnoreParenCasts() {
1561  Expr *E = this;
1562  while (true) {
1563    if (ParenExpr *P = dyn_cast<ParenExpr>(E))
1564      E = P->getSubExpr();
1565    else if (CastExpr *P = dyn_cast<CastExpr>(E))
1566      E = P->getSubExpr();
1567    else
1568      return E;
1569  }
1570}
1571
1572Expr *Expr::IgnoreParenImpCasts() {
1573  Expr *E = this;
1574  while (true) {
1575    if (ParenExpr *P = dyn_cast<ParenExpr>(E))
1576      E = P->getSubExpr();
1577    else if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E))
1578      E = P->getSubExpr();
1579    else
1580      return E;
1581  }
1582}
1583
1584/// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
1585/// value (including ptr->int casts of the same size).  Strip off any
1586/// ParenExpr or CastExprs, returning their operand.
1587Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
1588  Expr *E = this;
1589  while (true) {
1590    if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
1591      E = P->getSubExpr();
1592      continue;
1593    }
1594
1595    if (CastExpr *P = dyn_cast<CastExpr>(E)) {
1596      // We ignore integer <-> casts that are of the same width, ptr<->ptr and
1597      // ptr<->int casts of the same width.  We also ignore all identify casts.
1598      Expr *SE = P->getSubExpr();
1599
1600      if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
1601        E = SE;
1602        continue;
1603      }
1604
1605      if ((E->getType()->isPointerType() || E->getType()->isIntegralType()) &&
1606          (SE->getType()->isPointerType() || SE->getType()->isIntegralType()) &&
1607          Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
1608        E = SE;
1609        continue;
1610      }
1611    }
1612
1613    return E;
1614  }
1615}
1616
1617bool Expr::isDefaultArgument() const {
1618  const Expr *E = this;
1619  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
1620    E = ICE->getSubExprAsWritten();
1621
1622  return isa<CXXDefaultArgExpr>(E);
1623}
1624
1625/// \brief Skip over any no-op casts and any temporary-binding
1626/// expressions.
1627static const Expr *skipTemporaryBindingsAndNoOpCasts(const Expr *E) {
1628  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1629    if (ICE->getCastKind() == CastExpr::CK_NoOp)
1630      E = ICE->getSubExpr();
1631    else
1632      break;
1633  }
1634
1635  while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
1636    E = BE->getSubExpr();
1637
1638  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1639    if (ICE->getCastKind() == CastExpr::CK_NoOp)
1640      E = ICE->getSubExpr();
1641    else
1642      break;
1643  }
1644
1645  return E;
1646}
1647
1648const Expr *Expr::getTemporaryObject() const {
1649  const Expr *E = skipTemporaryBindingsAndNoOpCasts(this);
1650
1651  // A cast can produce a temporary object. The object's construction
1652  // is represented as a CXXConstructExpr.
1653  if (const CastExpr *Cast = dyn_cast<CastExpr>(E)) {
1654    // Only user-defined and constructor conversions can produce
1655    // temporary objects.
1656    if (Cast->getCastKind() != CastExpr::CK_ConstructorConversion &&
1657        Cast->getCastKind() != CastExpr::CK_UserDefinedConversion)
1658      return 0;
1659
1660    // Strip off temporary bindings and no-op casts.
1661    const Expr *Sub = skipTemporaryBindingsAndNoOpCasts(Cast->getSubExpr());
1662
1663    // If this is a constructor conversion, see if we have an object
1664    // construction.
1665    if (Cast->getCastKind() == CastExpr::CK_ConstructorConversion)
1666      return dyn_cast<CXXConstructExpr>(Sub);
1667
1668    // If this is a user-defined conversion, see if we have a call to
1669    // a function that itself returns a temporary object.
1670    if (Cast->getCastKind() == CastExpr::CK_UserDefinedConversion)
1671      if (const CallExpr *CE = dyn_cast<CallExpr>(Sub))
1672        if (CE->getCallReturnType()->isRecordType())
1673          return CE;
1674
1675    return 0;
1676  }
1677
1678  // A call returning a class type returns a temporary.
1679  if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
1680    if (CE->getCallReturnType()->isRecordType())
1681      return CE;
1682
1683    return 0;
1684  }
1685
1686  // Explicit temporary object constructors create temporaries.
1687  return dyn_cast<CXXTemporaryObjectExpr>(E);
1688}
1689
1690/// hasAnyTypeDependentArguments - Determines if any of the expressions
1691/// in Exprs is type-dependent.
1692bool Expr::hasAnyTypeDependentArguments(Expr** Exprs, unsigned NumExprs) {
1693  for (unsigned I = 0; I < NumExprs; ++I)
1694    if (Exprs[I]->isTypeDependent())
1695      return true;
1696
1697  return false;
1698}
1699
1700/// hasAnyValueDependentArguments - Determines if any of the expressions
1701/// in Exprs is value-dependent.
1702bool Expr::hasAnyValueDependentArguments(Expr** Exprs, unsigned NumExprs) {
1703  for (unsigned I = 0; I < NumExprs; ++I)
1704    if (Exprs[I]->isValueDependent())
1705      return true;
1706
1707  return false;
1708}
1709
1710bool Expr::isConstantInitializer(ASTContext &Ctx) const {
1711  // This function is attempting whether an expression is an initializer
1712  // which can be evaluated at compile-time.  isEvaluatable handles most
1713  // of the cases, but it can't deal with some initializer-specific
1714  // expressions, and it can't deal with aggregates; we deal with those here,
1715  // and fall back to isEvaluatable for the other cases.
1716
1717  // FIXME: This function assumes the variable being assigned to
1718  // isn't a reference type!
1719
1720  switch (getStmtClass()) {
1721  default: break;
1722  case StringLiteralClass:
1723  case ObjCStringLiteralClass:
1724  case ObjCEncodeExprClass:
1725    return true;
1726  case CompoundLiteralExprClass: {
1727    // This handles gcc's extension that allows global initializers like
1728    // "struct x {int x;} x = (struct x) {};".
1729    // FIXME: This accepts other cases it shouldn't!
1730    const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
1731    return Exp->isConstantInitializer(Ctx);
1732  }
1733  case InitListExprClass: {
1734    // FIXME: This doesn't deal with fields with reference types correctly.
1735    // FIXME: This incorrectly allows pointers cast to integers to be assigned
1736    // to bitfields.
1737    const InitListExpr *Exp = cast<InitListExpr>(this);
1738    unsigned numInits = Exp->getNumInits();
1739    for (unsigned i = 0; i < numInits; i++) {
1740      if (!Exp->getInit(i)->isConstantInitializer(Ctx))
1741        return false;
1742    }
1743    return true;
1744  }
1745  case ImplicitValueInitExprClass:
1746    return true;
1747  case ParenExprClass:
1748    return cast<ParenExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
1749  case UnaryOperatorClass: {
1750    const UnaryOperator* Exp = cast<UnaryOperator>(this);
1751    if (Exp->getOpcode() == UnaryOperator::Extension)
1752      return Exp->getSubExpr()->isConstantInitializer(Ctx);
1753    break;
1754  }
1755  case BinaryOperatorClass: {
1756    // Special case &&foo - &&bar.  It would be nice to generalize this somehow
1757    // but this handles the common case.
1758    const BinaryOperator *Exp = cast<BinaryOperator>(this);
1759    if (Exp->getOpcode() == BinaryOperator::Sub &&
1760        isa<AddrLabelExpr>(Exp->getLHS()->IgnoreParenNoopCasts(Ctx)) &&
1761        isa<AddrLabelExpr>(Exp->getRHS()->IgnoreParenNoopCasts(Ctx)))
1762      return true;
1763    break;
1764  }
1765  case ImplicitCastExprClass:
1766  case CStyleCastExprClass:
1767    // Handle casts with a destination that's a struct or union; this
1768    // deals with both the gcc no-op struct cast extension and the
1769    // cast-to-union extension.
1770    if (getType()->isRecordType())
1771      return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
1772
1773    // Integer->integer casts can be handled here, which is important for
1774    // things like (int)(&&x-&&y).  Scary but true.
1775    if (getType()->isIntegerType() &&
1776        cast<CastExpr>(this)->getSubExpr()->getType()->isIntegerType())
1777      return cast<CastExpr>(this)->getSubExpr()->isConstantInitializer(Ctx);
1778
1779    break;
1780  }
1781  return isEvaluatable(Ctx);
1782}
1783
1784/// isNullPointerConstant - C99 6.3.2.3p3 -  Return true if this is either an
1785/// integer constant expression with the value zero, or if this is one that is
1786/// cast to void*.
1787bool Expr::isNullPointerConstant(ASTContext &Ctx,
1788                                 NullPointerConstantValueDependence NPC) const {
1789  if (isValueDependent()) {
1790    switch (NPC) {
1791    case NPC_NeverValueDependent:
1792      assert(false && "Unexpected value dependent expression!");
1793      // If the unthinkable happens, fall through to the safest alternative.
1794
1795    case NPC_ValueDependentIsNull:
1796      return isTypeDependent() || getType()->isIntegralType();
1797
1798    case NPC_ValueDependentIsNotNull:
1799      return false;
1800    }
1801  }
1802
1803  // Strip off a cast to void*, if it exists. Except in C++.
1804  if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
1805    if (!Ctx.getLangOptions().CPlusPlus) {
1806      // Check that it is a cast to void*.
1807      if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
1808        QualType Pointee = PT->getPointeeType();
1809        if (!Pointee.hasQualifiers() &&
1810            Pointee->isVoidType() &&                              // to void*
1811            CE->getSubExpr()->getType()->isIntegerType())         // from int.
1812          return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
1813      }
1814    }
1815  } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
1816    // Ignore the ImplicitCastExpr type entirely.
1817    return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
1818  } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
1819    // Accept ((void*)0) as a null pointer constant, as many other
1820    // implementations do.
1821    return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
1822  } else if (const CXXDefaultArgExpr *DefaultArg
1823               = dyn_cast<CXXDefaultArgExpr>(this)) {
1824    // See through default argument expressions
1825    return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
1826  } else if (isa<GNUNullExpr>(this)) {
1827    // The GNU __null extension is always a null pointer constant.
1828    return true;
1829  }
1830
1831  // C++0x nullptr_t is always a null pointer constant.
1832  if (getType()->isNullPtrType())
1833    return true;
1834
1835  // This expression must be an integer type.
1836  if (!getType()->isIntegerType() ||
1837      (Ctx.getLangOptions().CPlusPlus && getType()->isEnumeralType()))
1838    return false;
1839
1840  // If we have an integer constant expression, we need to *evaluate* it and
1841  // test for the value 0.
1842  llvm::APSInt Result;
1843  return isIntegerConstantExpr(Result, Ctx) && Result == 0;
1844}
1845
1846FieldDecl *Expr::getBitField() {
1847  Expr *E = this->IgnoreParens();
1848
1849  while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1850    if (ICE->isLvalueCast() && ICE->getCastKind() == CastExpr::CK_NoOp)
1851      E = ICE->getSubExpr()->IgnoreParens();
1852    else
1853      break;
1854  }
1855
1856  if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
1857    if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
1858      if (Field->isBitField())
1859        return Field;
1860
1861  if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E))
1862    if (BinOp->isAssignmentOp() && BinOp->getLHS())
1863      return BinOp->getLHS()->getBitField();
1864
1865  return 0;
1866}
1867
1868bool Expr::refersToVectorElement() const {
1869  const Expr *E = this->IgnoreParens();
1870
1871  while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
1872    if (ICE->isLvalueCast() && ICE->getCastKind() == CastExpr::CK_NoOp)
1873      E = ICE->getSubExpr()->IgnoreParens();
1874    else
1875      break;
1876  }
1877
1878  if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
1879    return ASE->getBase()->getType()->isVectorType();
1880
1881  if (isa<ExtVectorElementExpr>(E))
1882    return true;
1883
1884  return false;
1885}
1886
1887/// isArrow - Return true if the base expression is a pointer to vector,
1888/// return false if the base expression is a vector.
1889bool ExtVectorElementExpr::isArrow() const {
1890  return getBase()->getType()->isPointerType();
1891}
1892
1893unsigned ExtVectorElementExpr::getNumElements() const {
1894  if (const VectorType *VT = getType()->getAs<VectorType>())
1895    return VT->getNumElements();
1896  return 1;
1897}
1898
1899/// containsDuplicateElements - Return true if any element access is repeated.
1900bool ExtVectorElementExpr::containsDuplicateElements() const {
1901  // FIXME: Refactor this code to an accessor on the AST node which returns the
1902  // "type" of component access, and share with code below and in Sema.
1903  llvm::StringRef Comp = Accessor->getName();
1904
1905  // Halving swizzles do not contain duplicate elements.
1906  if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
1907    return false;
1908
1909  // Advance past s-char prefix on hex swizzles.
1910  if (Comp[0] == 's' || Comp[0] == 'S')
1911    Comp = Comp.substr(1);
1912
1913  for (unsigned i = 0, e = Comp.size(); i != e; ++i)
1914    if (Comp.substr(i + 1).find(Comp[i]) != llvm::StringRef::npos)
1915        return true;
1916
1917  return false;
1918}
1919
1920/// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
1921void ExtVectorElementExpr::getEncodedElementAccess(
1922                                  llvm::SmallVectorImpl<unsigned> &Elts) const {
1923  llvm::StringRef Comp = Accessor->getName();
1924  if (Comp[0] == 's' || Comp[0] == 'S')
1925    Comp = Comp.substr(1);
1926
1927  bool isHi =   Comp == "hi";
1928  bool isLo =   Comp == "lo";
1929  bool isEven = Comp == "even";
1930  bool isOdd  = Comp == "odd";
1931
1932  for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
1933    uint64_t Index;
1934
1935    if (isHi)
1936      Index = e + i;
1937    else if (isLo)
1938      Index = i;
1939    else if (isEven)
1940      Index = 2 * i;
1941    else if (isOdd)
1942      Index = 2 * i + 1;
1943    else
1944      Index = ExtVectorType::getAccessorIdx(Comp[i]);
1945
1946    Elts.push_back(Index);
1947  }
1948}
1949
1950ObjCMessageExpr::ObjCMessageExpr(QualType T,
1951                                 SourceLocation LBracLoc,
1952                                 SourceLocation SuperLoc,
1953                                 bool IsInstanceSuper,
1954                                 QualType SuperType,
1955                                 Selector Sel,
1956                                 ObjCMethodDecl *Method,
1957                                 Expr **Args, unsigned NumArgs,
1958                                 SourceLocation RBracLoc)
1959  : Expr(ObjCMessageExprClass, T, /*TypeDependent=*/false,
1960         /*ValueDependent=*/false),
1961    NumArgs(NumArgs), Kind(IsInstanceSuper? SuperInstance : SuperClass),
1962    HasMethod(Method != 0), SuperLoc(SuperLoc),
1963    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
1964                                                       : Sel.getAsOpaquePtr())),
1965    LBracLoc(LBracLoc), RBracLoc(RBracLoc)
1966{
1967  setReceiverPointer(SuperType.getAsOpaquePtr());
1968  if (NumArgs)
1969    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
1970}
1971
1972ObjCMessageExpr::ObjCMessageExpr(QualType T,
1973                                 SourceLocation LBracLoc,
1974                                 TypeSourceInfo *Receiver,
1975                                 Selector Sel,
1976                                 ObjCMethodDecl *Method,
1977                                 Expr **Args, unsigned NumArgs,
1978                                 SourceLocation RBracLoc)
1979  : Expr(ObjCMessageExprClass, T, T->isDependentType(),
1980         (T->isDependentType() ||
1981          hasAnyValueDependentArguments(Args, NumArgs))),
1982    NumArgs(NumArgs), Kind(Class), HasMethod(Method != 0),
1983    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
1984                                                       : Sel.getAsOpaquePtr())),
1985    LBracLoc(LBracLoc), RBracLoc(RBracLoc)
1986{
1987  setReceiverPointer(Receiver);
1988  if (NumArgs)
1989    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
1990}
1991
1992ObjCMessageExpr::ObjCMessageExpr(QualType T,
1993                                 SourceLocation LBracLoc,
1994                                 Expr *Receiver,
1995                                 Selector Sel,
1996                                 ObjCMethodDecl *Method,
1997                                 Expr **Args, unsigned NumArgs,
1998                                 SourceLocation RBracLoc)
1999  : Expr(ObjCMessageExprClass, T, Receiver->isTypeDependent(),
2000         (Receiver->isTypeDependent() ||
2001          hasAnyValueDependentArguments(Args, NumArgs))),
2002    NumArgs(NumArgs), Kind(Instance), HasMethod(Method != 0),
2003    SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2004                                                       : Sel.getAsOpaquePtr())),
2005    LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2006{
2007  setReceiverPointer(Receiver);
2008  if (NumArgs)
2009    memcpy(getArgs(), Args, NumArgs * sizeof(Expr *));
2010}
2011
2012ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2013                                         SourceLocation LBracLoc,
2014                                         SourceLocation SuperLoc,
2015                                         bool IsInstanceSuper,
2016                                         QualType SuperType,
2017                                         Selector Sel,
2018                                         ObjCMethodDecl *Method,
2019                                         Expr **Args, unsigned NumArgs,
2020                                         SourceLocation RBracLoc) {
2021  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2022    NumArgs * sizeof(Expr *);
2023  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2024  return new (Mem) ObjCMessageExpr(T, LBracLoc, SuperLoc, IsInstanceSuper,
2025                                   SuperType, Sel, Method, Args, NumArgs,
2026                                   RBracLoc);
2027}
2028
2029ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2030                                         SourceLocation LBracLoc,
2031                                         TypeSourceInfo *Receiver,
2032                                         Selector Sel,
2033                                         ObjCMethodDecl *Method,
2034                                         Expr **Args, unsigned NumArgs,
2035                                         SourceLocation RBracLoc) {
2036  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2037    NumArgs * sizeof(Expr *);
2038  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2039  return new (Mem) ObjCMessageExpr(T, LBracLoc, Receiver, Sel, Method, Args,
2040                                   NumArgs, RBracLoc);
2041}
2042
2043ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2044                                         SourceLocation LBracLoc,
2045                                         Expr *Receiver,
2046                                         Selector Sel,
2047                                         ObjCMethodDecl *Method,
2048                                         Expr **Args, unsigned NumArgs,
2049                                         SourceLocation RBracLoc) {
2050  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2051    NumArgs * sizeof(Expr *);
2052  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2053  return new (Mem) ObjCMessageExpr(T, LBracLoc, Receiver, Sel, Method, Args,
2054                                   NumArgs, RBracLoc);
2055}
2056
2057ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
2058                                              unsigned NumArgs) {
2059  unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2060    NumArgs * sizeof(Expr *);
2061  void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
2062  return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
2063}
2064
2065Selector ObjCMessageExpr::getSelector() const {
2066  if (HasMethod)
2067    return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
2068                                                               ->getSelector();
2069  return Selector(SelectorOrMethod);
2070}
2071
2072ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
2073  switch (getReceiverKind()) {
2074  case Instance:
2075    if (const ObjCObjectPointerType *Ptr
2076          = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
2077      return Ptr->getInterfaceDecl();
2078    break;
2079
2080  case Class:
2081    if (const ObjCInterfaceType *Iface
2082                       = getClassReceiver()->getAs<ObjCInterfaceType>())
2083      return Iface->getDecl();
2084    break;
2085
2086  case SuperInstance:
2087    if (const ObjCObjectPointerType *Ptr
2088          = getSuperType()->getAs<ObjCObjectPointerType>())
2089      return Ptr->getInterfaceDecl();
2090    break;
2091
2092  case SuperClass:
2093    if (const ObjCObjectPointerType *Iface
2094                       = getSuperType()->getAs<ObjCObjectPointerType>())
2095      return Iface->getInterfaceDecl();
2096    break;
2097  }
2098
2099  return 0;
2100}
2101
2102bool ChooseExpr::isConditionTrue(ASTContext &C) const {
2103  return getCond()->EvaluateAsInt(C) != 0;
2104}
2105
2106void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
2107                                 unsigned NumExprs) {
2108  if (SubExprs) C.Deallocate(SubExprs);
2109
2110  SubExprs = new (C) Stmt* [NumExprs];
2111  this->NumExprs = NumExprs;
2112  memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
2113}
2114
2115void ShuffleVectorExpr::DoDestroy(ASTContext& C) {
2116  DestroyChildren(C);
2117  if (SubExprs) C.Deallocate(SubExprs);
2118  this->~ShuffleVectorExpr();
2119  C.Deallocate(this);
2120}
2121
2122void SizeOfAlignOfExpr::DoDestroy(ASTContext& C) {
2123  // Override default behavior of traversing children. If this has a type
2124  // operand and the type is a variable-length array, the child iteration
2125  // will iterate over the size expression. However, this expression belongs
2126  // to the type, not to this, so we don't want to delete it.
2127  // We still want to delete this expression.
2128  if (isArgumentType()) {
2129    this->~SizeOfAlignOfExpr();
2130    C.Deallocate(this);
2131  }
2132  else
2133    Expr::DoDestroy(C);
2134}
2135
2136//===----------------------------------------------------------------------===//
2137//  DesignatedInitExpr
2138//===----------------------------------------------------------------------===//
2139
2140IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() {
2141  assert(Kind == FieldDesignator && "Only valid on a field designator");
2142  if (Field.NameOrField & 0x01)
2143    return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
2144  else
2145    return getField()->getIdentifier();
2146}
2147
2148DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
2149                                       unsigned NumDesignators,
2150                                       const Designator *Designators,
2151                                       SourceLocation EqualOrColonLoc,
2152                                       bool GNUSyntax,
2153                                       Expr **IndexExprs,
2154                                       unsigned NumIndexExprs,
2155                                       Expr *Init)
2156  : Expr(DesignatedInitExprClass, Ty,
2157         Init->isTypeDependent(), Init->isValueDependent()),
2158    EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
2159    NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
2160  this->Designators = new (C) Designator[NumDesignators];
2161
2162  // Record the initializer itself.
2163  child_iterator Child = child_begin();
2164  *Child++ = Init;
2165
2166  // Copy the designators and their subexpressions, computing
2167  // value-dependence along the way.
2168  unsigned IndexIdx = 0;
2169  for (unsigned I = 0; I != NumDesignators; ++I) {
2170    this->Designators[I] = Designators[I];
2171
2172    if (this->Designators[I].isArrayDesignator()) {
2173      // Compute type- and value-dependence.
2174      Expr *Index = IndexExprs[IndexIdx];
2175      ValueDependent = ValueDependent ||
2176        Index->isTypeDependent() || Index->isValueDependent();
2177
2178      // Copy the index expressions into permanent storage.
2179      *Child++ = IndexExprs[IndexIdx++];
2180    } else if (this->Designators[I].isArrayRangeDesignator()) {
2181      // Compute type- and value-dependence.
2182      Expr *Start = IndexExprs[IndexIdx];
2183      Expr *End = IndexExprs[IndexIdx + 1];
2184      ValueDependent = ValueDependent ||
2185        Start->isTypeDependent() || Start->isValueDependent() ||
2186        End->isTypeDependent() || End->isValueDependent();
2187
2188      // Copy the start/end expressions into permanent storage.
2189      *Child++ = IndexExprs[IndexIdx++];
2190      *Child++ = IndexExprs[IndexIdx++];
2191    }
2192  }
2193
2194  assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
2195}
2196
2197DesignatedInitExpr *
2198DesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
2199                           unsigned NumDesignators,
2200                           Expr **IndexExprs, unsigned NumIndexExprs,
2201                           SourceLocation ColonOrEqualLoc,
2202                           bool UsesColonSyntax, Expr *Init) {
2203  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2204                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2205  return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
2206                                      ColonOrEqualLoc, UsesColonSyntax,
2207                                      IndexExprs, NumIndexExprs, Init);
2208}
2209
2210DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
2211                                                    unsigned NumIndexExprs) {
2212  void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
2213                         sizeof(Stmt *) * (NumIndexExprs + 1), 8);
2214  return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
2215}
2216
2217void DesignatedInitExpr::setDesignators(ASTContext &C,
2218                                        const Designator *Desigs,
2219                                        unsigned NumDesigs) {
2220  DestroyDesignators(C);
2221
2222  Designators = new (C) Designator[NumDesigs];
2223  NumDesignators = NumDesigs;
2224  for (unsigned I = 0; I != NumDesigs; ++I)
2225    Designators[I] = Desigs[I];
2226}
2227
2228SourceRange DesignatedInitExpr::getSourceRange() const {
2229  SourceLocation StartLoc;
2230  Designator &First =
2231    *const_cast<DesignatedInitExpr*>(this)->designators_begin();
2232  if (First.isFieldDesignator()) {
2233    if (GNUSyntax)
2234      StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
2235    else
2236      StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
2237  } else
2238    StartLoc =
2239      SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
2240  return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
2241}
2242
2243Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
2244  assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
2245  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2246  Ptr += sizeof(DesignatedInitExpr);
2247  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2248  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2249}
2250
2251Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
2252  assert(D.Kind == Designator::ArrayRangeDesignator &&
2253         "Requires array range designator");
2254  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2255  Ptr += sizeof(DesignatedInitExpr);
2256  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2257  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
2258}
2259
2260Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
2261  assert(D.Kind == Designator::ArrayRangeDesignator &&
2262         "Requires array range designator");
2263  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2264  Ptr += sizeof(DesignatedInitExpr);
2265  Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2266  return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
2267}
2268
2269/// \brief Replaces the designator at index @p Idx with the series
2270/// of designators in [First, Last).
2271void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
2272                                          const Designator *First,
2273                                          const Designator *Last) {
2274  unsigned NumNewDesignators = Last - First;
2275  if (NumNewDesignators == 0) {
2276    std::copy_backward(Designators + Idx + 1,
2277                       Designators + NumDesignators,
2278                       Designators + Idx);
2279    --NumNewDesignators;
2280    return;
2281  } else if (NumNewDesignators == 1) {
2282    Designators[Idx] = *First;
2283    return;
2284  }
2285
2286  Designator *NewDesignators
2287    = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
2288  std::copy(Designators, Designators + Idx, NewDesignators);
2289  std::copy(First, Last, NewDesignators + Idx);
2290  std::copy(Designators + Idx + 1, Designators + NumDesignators,
2291            NewDesignators + Idx + NumNewDesignators);
2292  DestroyDesignators(C);
2293  Designators = NewDesignators;
2294  NumDesignators = NumDesignators - 1 + NumNewDesignators;
2295}
2296
2297void DesignatedInitExpr::DoDestroy(ASTContext &C) {
2298  DestroyDesignators(C);
2299  Expr::DoDestroy(C);
2300}
2301
2302void DesignatedInitExpr::DestroyDesignators(ASTContext &C) {
2303  for (unsigned I = 0; I != NumDesignators; ++I)
2304    Designators[I].~Designator();
2305  C.Deallocate(Designators);
2306  Designators = 0;
2307}
2308
2309ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
2310                             Expr **exprs, unsigned nexprs,
2311                             SourceLocation rparenloc)
2312: Expr(ParenListExprClass, QualType(),
2313       hasAnyTypeDependentArguments(exprs, nexprs),
2314       hasAnyValueDependentArguments(exprs, nexprs)),
2315  NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
2316
2317  Exprs = new (C) Stmt*[nexprs];
2318  for (unsigned i = 0; i != nexprs; ++i)
2319    Exprs[i] = exprs[i];
2320}
2321
2322void ParenListExpr::DoDestroy(ASTContext& C) {
2323  DestroyChildren(C);
2324  if (Exprs) C.Deallocate(Exprs);
2325  this->~ParenListExpr();
2326  C.Deallocate(this);
2327}
2328
2329//===----------------------------------------------------------------------===//
2330//  ExprIterator.
2331//===----------------------------------------------------------------------===//
2332
2333Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
2334Expr* ExprIterator::operator*() const { return cast<Expr>(*I); }
2335Expr* ExprIterator::operator->() const { return cast<Expr>(*I); }
2336const Expr* ConstExprIterator::operator[](size_t idx) const {
2337  return cast<Expr>(I[idx]);
2338}
2339const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
2340const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
2341
2342//===----------------------------------------------------------------------===//
2343//  Child Iterators for iterating over subexpressions/substatements
2344//===----------------------------------------------------------------------===//
2345
2346// DeclRefExpr
2347Stmt::child_iterator DeclRefExpr::child_begin() { return child_iterator(); }
2348Stmt::child_iterator DeclRefExpr::child_end() { return child_iterator(); }
2349
2350// ObjCIvarRefExpr
2351Stmt::child_iterator ObjCIvarRefExpr::child_begin() { return &Base; }
2352Stmt::child_iterator ObjCIvarRefExpr::child_end() { return &Base+1; }
2353
2354// ObjCPropertyRefExpr
2355Stmt::child_iterator ObjCPropertyRefExpr::child_begin() { return &Base; }
2356Stmt::child_iterator ObjCPropertyRefExpr::child_end() { return &Base+1; }
2357
2358// ObjCImplicitSetterGetterRefExpr
2359Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_begin() {
2360  // If this is accessing a class member, skip that entry.
2361  if (Base) return &Base;
2362  return &Base+1;
2363}
2364Stmt::child_iterator ObjCImplicitSetterGetterRefExpr::child_end() {
2365  return &Base+1;
2366}
2367
2368// ObjCSuperExpr
2369Stmt::child_iterator ObjCSuperExpr::child_begin() { return child_iterator(); }
2370Stmt::child_iterator ObjCSuperExpr::child_end() { return child_iterator(); }
2371
2372// ObjCIsaExpr
2373Stmt::child_iterator ObjCIsaExpr::child_begin() { return &Base; }
2374Stmt::child_iterator ObjCIsaExpr::child_end() { return &Base+1; }
2375
2376// PredefinedExpr
2377Stmt::child_iterator PredefinedExpr::child_begin() { return child_iterator(); }
2378Stmt::child_iterator PredefinedExpr::child_end() { return child_iterator(); }
2379
2380// IntegerLiteral
2381Stmt::child_iterator IntegerLiteral::child_begin() { return child_iterator(); }
2382Stmt::child_iterator IntegerLiteral::child_end() { return child_iterator(); }
2383
2384// CharacterLiteral
2385Stmt::child_iterator CharacterLiteral::child_begin() { return child_iterator();}
2386Stmt::child_iterator CharacterLiteral::child_end() { return child_iterator(); }
2387
2388// FloatingLiteral
2389Stmt::child_iterator FloatingLiteral::child_begin() { return child_iterator(); }
2390Stmt::child_iterator FloatingLiteral::child_end() { return child_iterator(); }
2391
2392// ImaginaryLiteral
2393Stmt::child_iterator ImaginaryLiteral::child_begin() { return &Val; }
2394Stmt::child_iterator ImaginaryLiteral::child_end() { return &Val+1; }
2395
2396// StringLiteral
2397Stmt::child_iterator StringLiteral::child_begin() { return child_iterator(); }
2398Stmt::child_iterator StringLiteral::child_end() { return child_iterator(); }
2399
2400// ParenExpr
2401Stmt::child_iterator ParenExpr::child_begin() { return &Val; }
2402Stmt::child_iterator ParenExpr::child_end() { return &Val+1; }
2403
2404// UnaryOperator
2405Stmt::child_iterator UnaryOperator::child_begin() { return &Val; }
2406Stmt::child_iterator UnaryOperator::child_end() { return &Val+1; }
2407
2408// OffsetOfExpr
2409Stmt::child_iterator OffsetOfExpr::child_begin() {
2410  return reinterpret_cast<Stmt **> (reinterpret_cast<OffsetOfNode *> (this + 1)
2411                                      + NumComps);
2412}
2413Stmt::child_iterator OffsetOfExpr::child_end() {
2414  return child_iterator(&*child_begin() + NumExprs);
2415}
2416
2417// SizeOfAlignOfExpr
2418Stmt::child_iterator SizeOfAlignOfExpr::child_begin() {
2419  // If this is of a type and the type is a VLA type (and not a typedef), the
2420  // size expression of the VLA needs to be treated as an executable expression.
2421  // Why isn't this weirdness documented better in StmtIterator?
2422  if (isArgumentType()) {
2423    if (VariableArrayType* T = dyn_cast<VariableArrayType>(
2424                                   getArgumentType().getTypePtr()))
2425      return child_iterator(T);
2426    return child_iterator();
2427  }
2428  return child_iterator(&Argument.Ex);
2429}
2430Stmt::child_iterator SizeOfAlignOfExpr::child_end() {
2431  if (isArgumentType())
2432    return child_iterator();
2433  return child_iterator(&Argument.Ex + 1);
2434}
2435
2436// ArraySubscriptExpr
2437Stmt::child_iterator ArraySubscriptExpr::child_begin() {
2438  return &SubExprs[0];
2439}
2440Stmt::child_iterator ArraySubscriptExpr::child_end() {
2441  return &SubExprs[0]+END_EXPR;
2442}
2443
2444// CallExpr
2445Stmt::child_iterator CallExpr::child_begin() {
2446  return &SubExprs[0];
2447}
2448Stmt::child_iterator CallExpr::child_end() {
2449  return &SubExprs[0]+NumArgs+ARGS_START;
2450}
2451
2452// MemberExpr
2453Stmt::child_iterator MemberExpr::child_begin() { return &Base; }
2454Stmt::child_iterator MemberExpr::child_end() { return &Base+1; }
2455
2456// ExtVectorElementExpr
2457Stmt::child_iterator ExtVectorElementExpr::child_begin() { return &Base; }
2458Stmt::child_iterator ExtVectorElementExpr::child_end() { return &Base+1; }
2459
2460// CompoundLiteralExpr
2461Stmt::child_iterator CompoundLiteralExpr::child_begin() { return &Init; }
2462Stmt::child_iterator CompoundLiteralExpr::child_end() { return &Init+1; }
2463
2464// CastExpr
2465Stmt::child_iterator CastExpr::child_begin() { return &Op; }
2466Stmt::child_iterator CastExpr::child_end() { return &Op+1; }
2467
2468// BinaryOperator
2469Stmt::child_iterator BinaryOperator::child_begin() {
2470  return &SubExprs[0];
2471}
2472Stmt::child_iterator BinaryOperator::child_end() {
2473  return &SubExprs[0]+END_EXPR;
2474}
2475
2476// ConditionalOperator
2477Stmt::child_iterator ConditionalOperator::child_begin() {
2478  return &SubExprs[0];
2479}
2480Stmt::child_iterator ConditionalOperator::child_end() {
2481  return &SubExprs[0]+END_EXPR;
2482}
2483
2484// AddrLabelExpr
2485Stmt::child_iterator AddrLabelExpr::child_begin() { return child_iterator(); }
2486Stmt::child_iterator AddrLabelExpr::child_end() { return child_iterator(); }
2487
2488// StmtExpr
2489Stmt::child_iterator StmtExpr::child_begin() { return &SubStmt; }
2490Stmt::child_iterator StmtExpr::child_end() { return &SubStmt+1; }
2491
2492// TypesCompatibleExpr
2493Stmt::child_iterator TypesCompatibleExpr::child_begin() {
2494  return child_iterator();
2495}
2496
2497Stmt::child_iterator TypesCompatibleExpr::child_end() {
2498  return child_iterator();
2499}
2500
2501// ChooseExpr
2502Stmt::child_iterator ChooseExpr::child_begin() { return &SubExprs[0]; }
2503Stmt::child_iterator ChooseExpr::child_end() { return &SubExprs[0]+END_EXPR; }
2504
2505// GNUNullExpr
2506Stmt::child_iterator GNUNullExpr::child_begin() { return child_iterator(); }
2507Stmt::child_iterator GNUNullExpr::child_end() { return child_iterator(); }
2508
2509// ShuffleVectorExpr
2510Stmt::child_iterator ShuffleVectorExpr::child_begin() {
2511  return &SubExprs[0];
2512}
2513Stmt::child_iterator ShuffleVectorExpr::child_end() {
2514  return &SubExprs[0]+NumExprs;
2515}
2516
2517// VAArgExpr
2518Stmt::child_iterator VAArgExpr::child_begin() { return &Val; }
2519Stmt::child_iterator VAArgExpr::child_end() { return &Val+1; }
2520
2521// InitListExpr
2522Stmt::child_iterator InitListExpr::child_begin() {
2523  return InitExprs.size() ? &InitExprs[0] : 0;
2524}
2525Stmt::child_iterator InitListExpr::child_end() {
2526  return InitExprs.size() ? &InitExprs[0] + InitExprs.size() : 0;
2527}
2528
2529// DesignatedInitExpr
2530Stmt::child_iterator DesignatedInitExpr::child_begin() {
2531  char* Ptr = static_cast<char*>(static_cast<void *>(this));
2532  Ptr += sizeof(DesignatedInitExpr);
2533  return reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
2534}
2535Stmt::child_iterator DesignatedInitExpr::child_end() {
2536  return child_iterator(&*child_begin() + NumSubExprs);
2537}
2538
2539// ImplicitValueInitExpr
2540Stmt::child_iterator ImplicitValueInitExpr::child_begin() {
2541  return child_iterator();
2542}
2543
2544Stmt::child_iterator ImplicitValueInitExpr::child_end() {
2545  return child_iterator();
2546}
2547
2548// ParenListExpr
2549Stmt::child_iterator ParenListExpr::child_begin() {
2550  return &Exprs[0];
2551}
2552Stmt::child_iterator ParenListExpr::child_end() {
2553  return &Exprs[0]+NumExprs;
2554}
2555
2556// ObjCStringLiteral
2557Stmt::child_iterator ObjCStringLiteral::child_begin() {
2558  return &String;
2559}
2560Stmt::child_iterator ObjCStringLiteral::child_end() {
2561  return &String+1;
2562}
2563
2564// ObjCEncodeExpr
2565Stmt::child_iterator ObjCEncodeExpr::child_begin() { return child_iterator(); }
2566Stmt::child_iterator ObjCEncodeExpr::child_end() { return child_iterator(); }
2567
2568// ObjCSelectorExpr
2569Stmt::child_iterator ObjCSelectorExpr::child_begin() {
2570  return child_iterator();
2571}
2572Stmt::child_iterator ObjCSelectorExpr::child_end() {
2573  return child_iterator();
2574}
2575
2576// ObjCProtocolExpr
2577Stmt::child_iterator ObjCProtocolExpr::child_begin() {
2578  return child_iterator();
2579}
2580Stmt::child_iterator ObjCProtocolExpr::child_end() {
2581  return child_iterator();
2582}
2583
2584// ObjCMessageExpr
2585Stmt::child_iterator ObjCMessageExpr::child_begin() {
2586  if (getReceiverKind() == Instance)
2587    return reinterpret_cast<Stmt **>(this + 1);
2588  return getArgs();
2589}
2590Stmt::child_iterator ObjCMessageExpr::child_end() {
2591  return getArgs() + getNumArgs();
2592}
2593
2594// Blocks
2595Stmt::child_iterator BlockExpr::child_begin() { return child_iterator(); }
2596Stmt::child_iterator BlockExpr::child_end() { return child_iterator(); }
2597
2598Stmt::child_iterator BlockDeclRefExpr::child_begin() { return child_iterator();}
2599Stmt::child_iterator BlockDeclRefExpr::child_end() { return child_iterator(); }
2600