xref: /llvm-project-15.0.7/clang/lib/AST/Expr.cpp (revision 3a78a47a)
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/EvaluatedExprVisitor.h"
22 #include "clang/AST/RecordLayout.h"
23 #include "clang/AST/StmtVisitor.h"
24 #include "clang/Lex/LiteralSupport.h"
25 #include "clang/Lex/Lexer.h"
26 #include "clang/Sema/SemaDiagnostic.h"
27 #include "clang/Basic/Builtins.h"
28 #include "clang/Basic/SourceManager.h"
29 #include "clang/Basic/TargetInfo.h"
30 #include "llvm/Support/ErrorHandling.h"
31 #include "llvm/Support/raw_ostream.h"
32 #include <algorithm>
33 #include <cstring>
34 using namespace clang;
35 
36 /// isKnownToHaveBooleanValue - Return true if this is an integer expression
37 /// that is known to return 0 or 1.  This happens for _Bool/bool expressions
38 /// but also int expressions which are produced by things like comparisons in
39 /// C.
40 bool Expr::isKnownToHaveBooleanValue() const {
41   const Expr *E = IgnoreParens();
42 
43   // If this value has _Bool type, it is obvious 0/1.
44   if (E->getType()->isBooleanType()) return true;
45   // If this is a non-scalar-integer type, we don't care enough to try.
46   if (!E->getType()->isIntegralOrEnumerationType()) return false;
47 
48   if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
49     switch (UO->getOpcode()) {
50     case UO_Plus:
51       return UO->getSubExpr()->isKnownToHaveBooleanValue();
52     default:
53       return false;
54     }
55   }
56 
57   // Only look through implicit casts.  If the user writes
58   // '(int) (a && b)' treat it as an arbitrary int.
59   if (const ImplicitCastExpr *CE = dyn_cast<ImplicitCastExpr>(E))
60     return CE->getSubExpr()->isKnownToHaveBooleanValue();
61 
62   if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
63     switch (BO->getOpcode()) {
64     default: return false;
65     case BO_LT:   // Relational operators.
66     case BO_GT:
67     case BO_LE:
68     case BO_GE:
69     case BO_EQ:   // Equality operators.
70     case BO_NE:
71     case BO_LAnd: // AND operator.
72     case BO_LOr:  // Logical OR operator.
73       return true;
74 
75     case BO_And:  // Bitwise AND operator.
76     case BO_Xor:  // Bitwise XOR operator.
77     case BO_Or:   // Bitwise OR operator.
78       // Handle things like (x==2)|(y==12).
79       return BO->getLHS()->isKnownToHaveBooleanValue() &&
80              BO->getRHS()->isKnownToHaveBooleanValue();
81 
82     case BO_Comma:
83     case BO_Assign:
84       return BO->getRHS()->isKnownToHaveBooleanValue();
85     }
86   }
87 
88   if (const ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E))
89     return CO->getTrueExpr()->isKnownToHaveBooleanValue() &&
90            CO->getFalseExpr()->isKnownToHaveBooleanValue();
91 
92   return false;
93 }
94 
95 // Amusing macro metaprogramming hack: check whether a class provides
96 // a more specific implementation of getExprLoc().
97 //
98 // See also Stmt.cpp:{getLocStart(),getLocEnd()}.
99 namespace {
100   /// This implementation is used when a class provides a custom
101   /// implementation of getExprLoc.
102   template <class E, class T>
103   SourceLocation getExprLocImpl(const Expr *expr,
104                                 SourceLocation (T::*v)() const) {
105     return static_cast<const E*>(expr)->getExprLoc();
106   }
107 
108   /// This implementation is used when a class doesn't provide
109   /// a custom implementation of getExprLoc.  Overload resolution
110   /// should pick it over the implementation above because it's
111   /// more specialized according to function template partial ordering.
112   template <class E>
113   SourceLocation getExprLocImpl(const Expr *expr,
114                                 SourceLocation (Expr::*v)() const) {
115     return static_cast<const E*>(expr)->getLocStart();
116   }
117 }
118 
119 SourceLocation Expr::getExprLoc() const {
120   switch (getStmtClass()) {
121   case Stmt::NoStmtClass: llvm_unreachable("statement without class");
122 #define ABSTRACT_STMT(type)
123 #define STMT(type, base) \
124   case Stmt::type##Class: llvm_unreachable(#type " is not an Expr"); break;
125 #define EXPR(type, base) \
126   case Stmt::type##Class: return getExprLocImpl<type>(this, &type::getExprLoc);
127 #include "clang/AST/StmtNodes.inc"
128   }
129   llvm_unreachable("unknown statement kind");
130 }
131 
132 //===----------------------------------------------------------------------===//
133 // Primary Expressions.
134 //===----------------------------------------------------------------------===//
135 
136 /// \brief Compute the type-, value-, and instantiation-dependence of a
137 /// declaration reference
138 /// based on the declaration being referenced.
139 static void computeDeclRefDependence(ASTContext &Ctx, NamedDecl *D, QualType T,
140                                      bool &TypeDependent,
141                                      bool &ValueDependent,
142                                      bool &InstantiationDependent) {
143   TypeDependent = false;
144   ValueDependent = false;
145   InstantiationDependent = false;
146 
147   // (TD) C++ [temp.dep.expr]p3:
148   //   An id-expression is type-dependent if it contains:
149   //
150   // and
151   //
152   // (VD) C++ [temp.dep.constexpr]p2:
153   //  An identifier is value-dependent if it is:
154 
155   //  (TD)  - an identifier that was declared with dependent type
156   //  (VD)  - a name declared with a dependent type,
157   if (T->isDependentType()) {
158     TypeDependent = true;
159     ValueDependent = true;
160     InstantiationDependent = true;
161     return;
162   } else if (T->isInstantiationDependentType()) {
163     InstantiationDependent = true;
164   }
165 
166   //  (TD)  - a conversion-function-id that specifies a dependent type
167   if (D->getDeclName().getNameKind()
168                                 == DeclarationName::CXXConversionFunctionName) {
169     QualType T = D->getDeclName().getCXXNameType();
170     if (T->isDependentType()) {
171       TypeDependent = true;
172       ValueDependent = true;
173       InstantiationDependent = true;
174       return;
175     }
176 
177     if (T->isInstantiationDependentType())
178       InstantiationDependent = true;
179   }
180 
181   //  (VD)  - the name of a non-type template parameter,
182   if (isa<NonTypeTemplateParmDecl>(D)) {
183     ValueDependent = true;
184     InstantiationDependent = true;
185     return;
186   }
187 
188   //  (VD) - a constant with integral or enumeration type and is
189   //         initialized with an expression that is value-dependent.
190   //  (VD) - a constant with literal type and is initialized with an
191   //         expression that is value-dependent [C++11].
192   //  (VD) - FIXME: Missing from the standard:
193   //       -  an entity with reference type and is initialized with an
194   //          expression that is value-dependent [C++11]
195   if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
196     if ((Ctx.getLangOpts().CPlusPlus0x ?
197            Var->getType()->isLiteralType() :
198            Var->getType()->isIntegralOrEnumerationType()) &&
199         (Var->getType().getCVRQualifiers() == Qualifiers::Const ||
200          Var->getType()->isReferenceType())) {
201       if (const Expr *Init = Var->getAnyInitializer())
202         if (Init->isValueDependent()) {
203           ValueDependent = true;
204           InstantiationDependent = true;
205         }
206     }
207 
208     // (VD) - FIXME: Missing from the standard:
209     //      -  a member function or a static data member of the current
210     //         instantiation
211     if (Var->isStaticDataMember() &&
212         Var->getDeclContext()->isDependentContext()) {
213       ValueDependent = true;
214       InstantiationDependent = true;
215     }
216 
217     return;
218   }
219 
220   // (VD) - FIXME: Missing from the standard:
221   //      -  a member function or a static data member of the current
222   //         instantiation
223   if (isa<CXXMethodDecl>(D) && D->getDeclContext()->isDependentContext()) {
224     ValueDependent = true;
225     InstantiationDependent = true;
226   }
227 }
228 
229 void DeclRefExpr::computeDependence(ASTContext &Ctx) {
230   bool TypeDependent = false;
231   bool ValueDependent = false;
232   bool InstantiationDependent = false;
233   computeDeclRefDependence(Ctx, getDecl(), getType(), TypeDependent,
234                            ValueDependent, InstantiationDependent);
235 
236   // (TD) C++ [temp.dep.expr]p3:
237   //   An id-expression is type-dependent if it contains:
238   //
239   // and
240   //
241   // (VD) C++ [temp.dep.constexpr]p2:
242   //  An identifier is value-dependent if it is:
243   if (!TypeDependent && !ValueDependent &&
244       hasExplicitTemplateArgs() &&
245       TemplateSpecializationType::anyDependentTemplateArguments(
246                                                             getTemplateArgs(),
247                                                        getNumTemplateArgs(),
248                                                       InstantiationDependent)) {
249     TypeDependent = true;
250     ValueDependent = true;
251     InstantiationDependent = true;
252   }
253 
254   ExprBits.TypeDependent = TypeDependent;
255   ExprBits.ValueDependent = ValueDependent;
256   ExprBits.InstantiationDependent = InstantiationDependent;
257 
258   // Is the declaration a parameter pack?
259   if (getDecl()->isParameterPack())
260     ExprBits.ContainsUnexpandedParameterPack = true;
261 }
262 
263 DeclRefExpr::DeclRefExpr(ASTContext &Ctx,
264                          NestedNameSpecifierLoc QualifierLoc,
265                          SourceLocation TemplateKWLoc,
266                          ValueDecl *D, bool RefersToEnclosingLocal,
267                          const DeclarationNameInfo &NameInfo,
268                          NamedDecl *FoundD,
269                          const TemplateArgumentListInfo *TemplateArgs,
270                          QualType T, ExprValueKind VK)
271   : Expr(DeclRefExprClass, T, VK, OK_Ordinary, false, false, false, false),
272     D(D), Loc(NameInfo.getLoc()), DNLoc(NameInfo.getInfo()) {
273   DeclRefExprBits.HasQualifier = QualifierLoc ? 1 : 0;
274   if (QualifierLoc)
275     getInternalQualifierLoc() = QualifierLoc;
276   DeclRefExprBits.HasFoundDecl = FoundD ? 1 : 0;
277   if (FoundD)
278     getInternalFoundDecl() = FoundD;
279   DeclRefExprBits.HasTemplateKWAndArgsInfo
280     = (TemplateArgs || TemplateKWLoc.isValid()) ? 1 : 0;
281   DeclRefExprBits.RefersToEnclosingLocal = RefersToEnclosingLocal;
282   if (TemplateArgs) {
283     bool Dependent = false;
284     bool InstantiationDependent = false;
285     bool ContainsUnexpandedParameterPack = false;
286     getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *TemplateArgs,
287                                                Dependent,
288                                                InstantiationDependent,
289                                                ContainsUnexpandedParameterPack);
290     if (InstantiationDependent)
291       setInstantiationDependent(true);
292   } else if (TemplateKWLoc.isValid()) {
293     getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
294   }
295   DeclRefExprBits.HadMultipleCandidates = 0;
296 
297   computeDependence(Ctx);
298 }
299 
300 DeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
301                                  NestedNameSpecifierLoc QualifierLoc,
302                                  SourceLocation TemplateKWLoc,
303                                  ValueDecl *D,
304                                  bool RefersToEnclosingLocal,
305                                  SourceLocation NameLoc,
306                                  QualType T,
307                                  ExprValueKind VK,
308                                  NamedDecl *FoundD,
309                                  const TemplateArgumentListInfo *TemplateArgs) {
310   return Create(Context, QualifierLoc, TemplateKWLoc, D,
311                 RefersToEnclosingLocal,
312                 DeclarationNameInfo(D->getDeclName(), NameLoc),
313                 T, VK, FoundD, TemplateArgs);
314 }
315 
316 DeclRefExpr *DeclRefExpr::Create(ASTContext &Context,
317                                  NestedNameSpecifierLoc QualifierLoc,
318                                  SourceLocation TemplateKWLoc,
319                                  ValueDecl *D,
320                                  bool RefersToEnclosingLocal,
321                                  const DeclarationNameInfo &NameInfo,
322                                  QualType T,
323                                  ExprValueKind VK,
324                                  NamedDecl *FoundD,
325                                  const TemplateArgumentListInfo *TemplateArgs) {
326   // Filter out cases where the found Decl is the same as the value refenenced.
327   if (D == FoundD)
328     FoundD = 0;
329 
330   std::size_t Size = sizeof(DeclRefExpr);
331   if (QualifierLoc != 0)
332     Size += sizeof(NestedNameSpecifierLoc);
333   if (FoundD)
334     Size += sizeof(NamedDecl *);
335   if (TemplateArgs)
336     Size += ASTTemplateKWAndArgsInfo::sizeFor(TemplateArgs->size());
337   else if (TemplateKWLoc.isValid())
338     Size += ASTTemplateKWAndArgsInfo::sizeFor(0);
339 
340   void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
341   return new (Mem) DeclRefExpr(Context, QualifierLoc, TemplateKWLoc, D,
342                                RefersToEnclosingLocal,
343                                NameInfo, FoundD, TemplateArgs, T, VK);
344 }
345 
346 DeclRefExpr *DeclRefExpr::CreateEmpty(ASTContext &Context,
347                                       bool HasQualifier,
348                                       bool HasFoundDecl,
349                                       bool HasTemplateKWAndArgsInfo,
350                                       unsigned NumTemplateArgs) {
351   std::size_t Size = sizeof(DeclRefExpr);
352   if (HasQualifier)
353     Size += sizeof(NestedNameSpecifierLoc);
354   if (HasFoundDecl)
355     Size += sizeof(NamedDecl *);
356   if (HasTemplateKWAndArgsInfo)
357     Size += ASTTemplateKWAndArgsInfo::sizeFor(NumTemplateArgs);
358 
359   void *Mem = Context.Allocate(Size, llvm::alignOf<DeclRefExpr>());
360   return new (Mem) DeclRefExpr(EmptyShell());
361 }
362 
363 SourceRange DeclRefExpr::getSourceRange() const {
364   SourceRange R = getNameInfo().getSourceRange();
365   if (hasQualifier())
366     R.setBegin(getQualifierLoc().getBeginLoc());
367   if (hasExplicitTemplateArgs())
368     R.setEnd(getRAngleLoc());
369   return R;
370 }
371 SourceLocation DeclRefExpr::getLocStart() const {
372   if (hasQualifier())
373     return getQualifierLoc().getBeginLoc();
374   return getNameInfo().getLocStart();
375 }
376 SourceLocation DeclRefExpr::getLocEnd() const {
377   if (hasExplicitTemplateArgs())
378     return getRAngleLoc();
379   return getNameInfo().getLocEnd();
380 }
381 
382 // FIXME: Maybe this should use DeclPrinter with a special "print predefined
383 // expr" policy instead.
384 std::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
385   ASTContext &Context = CurrentDecl->getASTContext();
386 
387   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CurrentDecl)) {
388     if (IT != PrettyFunction && IT != PrettyFunctionNoVirtual)
389       return FD->getNameAsString();
390 
391     SmallString<256> Name;
392     llvm::raw_svector_ostream Out(Name);
393 
394     if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
395       if (MD->isVirtual() && IT != PrettyFunctionNoVirtual)
396         Out << "virtual ";
397       if (MD->isStatic())
398         Out << "static ";
399     }
400 
401     PrintingPolicy Policy(Context.getLangOpts());
402     std::string Proto = FD->getQualifiedNameAsString(Policy);
403     llvm::raw_string_ostream POut(Proto);
404 
405     const FunctionDecl *Decl = FD;
406     if (const FunctionDecl* Pattern = FD->getTemplateInstantiationPattern())
407       Decl = Pattern;
408     const FunctionType *AFT = Decl->getType()->getAs<FunctionType>();
409     const FunctionProtoType *FT = 0;
410     if (FD->hasWrittenPrototype())
411       FT = dyn_cast<FunctionProtoType>(AFT);
412 
413     POut << "(";
414     if (FT) {
415       for (unsigned i = 0, e = Decl->getNumParams(); i != e; ++i) {
416         if (i) POut << ", ";
417         POut << Decl->getParamDecl(i)->getType().stream(Policy);
418       }
419 
420       if (FT->isVariadic()) {
421         if (FD->getNumParams()) POut << ", ";
422         POut << "...";
423       }
424     }
425     POut << ")";
426 
427     if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
428       Qualifiers ThisQuals = Qualifiers::fromCVRMask(MD->getTypeQualifiers());
429       if (ThisQuals.hasConst())
430         POut << " const";
431       if (ThisQuals.hasVolatile())
432         POut << " volatile";
433       RefQualifierKind Ref = MD->getRefQualifier();
434       if (Ref == RQ_LValue)
435         POut << " &";
436       else if (Ref == RQ_RValue)
437         POut << " &&";
438     }
439 
440     typedef SmallVector<const ClassTemplateSpecializationDecl *, 8> SpecsTy;
441     SpecsTy Specs;
442     const DeclContext *Ctx = FD->getDeclContext();
443     while (Ctx && isa<NamedDecl>(Ctx)) {
444       const ClassTemplateSpecializationDecl *Spec
445                                = dyn_cast<ClassTemplateSpecializationDecl>(Ctx);
446       if (Spec && !Spec->isExplicitSpecialization())
447         Specs.push_back(Spec);
448       Ctx = Ctx->getParent();
449     }
450 
451     std::string TemplateParams;
452     llvm::raw_string_ostream TOut(TemplateParams);
453     for (SpecsTy::reverse_iterator I = Specs.rbegin(), E = Specs.rend();
454          I != E; ++I) {
455       const TemplateParameterList *Params
456                   = (*I)->getSpecializedTemplate()->getTemplateParameters();
457       const TemplateArgumentList &Args = (*I)->getTemplateArgs();
458       assert(Params->size() == Args.size());
459       for (unsigned i = 0, numParams = Params->size(); i != numParams; ++i) {
460         StringRef Param = Params->getParam(i)->getName();
461         if (Param.empty()) continue;
462         TOut << Param << " = ";
463         Args.get(i).print(Policy, TOut);
464         TOut << ", ";
465       }
466     }
467 
468     FunctionTemplateSpecializationInfo *FSI
469                                           = FD->getTemplateSpecializationInfo();
470     if (FSI && !FSI->isExplicitSpecialization()) {
471       const TemplateParameterList* Params
472                                   = FSI->getTemplate()->getTemplateParameters();
473       const TemplateArgumentList* Args = FSI->TemplateArguments;
474       assert(Params->size() == Args->size());
475       for (unsigned i = 0, e = Params->size(); i != e; ++i) {
476         StringRef Param = Params->getParam(i)->getName();
477         if (Param.empty()) continue;
478         TOut << Param << " = ";
479         Args->get(i).print(Policy, TOut);
480         TOut << ", ";
481       }
482     }
483 
484     TOut.flush();
485     if (!TemplateParams.empty()) {
486       // remove the trailing comma and space
487       TemplateParams.resize(TemplateParams.size() - 2);
488       POut << " [" << TemplateParams << "]";
489     }
490 
491     POut.flush();
492 
493     if (!isa<CXXConstructorDecl>(FD) && !isa<CXXDestructorDecl>(FD))
494       AFT->getResultType().getAsStringInternal(Proto, Policy);
495 
496     Out << Proto;
497 
498     Out.flush();
499     return Name.str().str();
500   }
501   if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(CurrentDecl)) {
502     SmallString<256> Name;
503     llvm::raw_svector_ostream Out(Name);
504     Out << (MD->isInstanceMethod() ? '-' : '+');
505     Out << '[';
506 
507     // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
508     // a null check to avoid a crash.
509     if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
510       Out << *ID;
511 
512     if (const ObjCCategoryImplDecl *CID =
513         dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext()))
514       Out << '(' << *CID << ')';
515 
516     Out <<  ' ';
517     Out << MD->getSelector().getAsString();
518     Out <<  ']';
519 
520     Out.flush();
521     return Name.str().str();
522   }
523   if (isa<TranslationUnitDecl>(CurrentDecl) && IT == PrettyFunction) {
524     // __PRETTY_FUNCTION__ -> "top level", the others produce an empty string.
525     return "top level";
526   }
527   return "";
528 }
529 
530 void APNumericStorage::setIntValue(ASTContext &C, const llvm::APInt &Val) {
531   if (hasAllocation())
532     C.Deallocate(pVal);
533 
534   BitWidth = Val.getBitWidth();
535   unsigned NumWords = Val.getNumWords();
536   const uint64_t* Words = Val.getRawData();
537   if (NumWords > 1) {
538     pVal = new (C) uint64_t[NumWords];
539     std::copy(Words, Words + NumWords, pVal);
540   } else if (NumWords == 1)
541     VAL = Words[0];
542   else
543     VAL = 0;
544 }
545 
546 IntegerLiteral *
547 IntegerLiteral::Create(ASTContext &C, const llvm::APInt &V,
548                        QualType type, SourceLocation l) {
549   return new (C) IntegerLiteral(C, V, type, l);
550 }
551 
552 IntegerLiteral *
553 IntegerLiteral::Create(ASTContext &C, EmptyShell Empty) {
554   return new (C) IntegerLiteral(Empty);
555 }
556 
557 FloatingLiteral *
558 FloatingLiteral::Create(ASTContext &C, const llvm::APFloat &V,
559                         bool isexact, QualType Type, SourceLocation L) {
560   return new (C) FloatingLiteral(C, V, isexact, Type, L);
561 }
562 
563 FloatingLiteral *
564 FloatingLiteral::Create(ASTContext &C, EmptyShell Empty) {
565   return new (C) FloatingLiteral(C, Empty);
566 }
567 
568 /// getValueAsApproximateDouble - This returns the value as an inaccurate
569 /// double.  Note that this may cause loss of precision, but is useful for
570 /// debugging dumps, etc.
571 double FloatingLiteral::getValueAsApproximateDouble() const {
572   llvm::APFloat V = getValue();
573   bool ignored;
574   V.convert(llvm::APFloat::IEEEdouble, llvm::APFloat::rmNearestTiesToEven,
575             &ignored);
576   return V.convertToDouble();
577 }
578 
579 int StringLiteral::mapCharByteWidth(TargetInfo const &target,StringKind k) {
580   int CharByteWidth = 0;
581   switch(k) {
582     case Ascii:
583     case UTF8:
584       CharByteWidth = target.getCharWidth();
585       break;
586     case Wide:
587       CharByteWidth = target.getWCharWidth();
588       break;
589     case UTF16:
590       CharByteWidth = target.getChar16Width();
591       break;
592     case UTF32:
593       CharByteWidth = target.getChar32Width();
594       break;
595   }
596   assert((CharByteWidth & 7) == 0 && "Assumes character size is byte multiple");
597   CharByteWidth /= 8;
598   assert((CharByteWidth==1 || CharByteWidth==2 || CharByteWidth==4)
599          && "character byte widths supported are 1, 2, and 4 only");
600   return CharByteWidth;
601 }
602 
603 StringLiteral *StringLiteral::Create(ASTContext &C, StringRef Str,
604                                      StringKind Kind, bool Pascal, QualType Ty,
605                                      const SourceLocation *Loc,
606                                      unsigned NumStrs) {
607   // Allocate enough space for the StringLiteral plus an array of locations for
608   // any concatenated string tokens.
609   void *Mem = C.Allocate(sizeof(StringLiteral)+
610                          sizeof(SourceLocation)*(NumStrs-1),
611                          llvm::alignOf<StringLiteral>());
612   StringLiteral *SL = new (Mem) StringLiteral(Ty);
613 
614   // OPTIMIZE: could allocate this appended to the StringLiteral.
615   SL->setString(C,Str,Kind,Pascal);
616 
617   SL->TokLocs[0] = Loc[0];
618   SL->NumConcatenated = NumStrs;
619 
620   if (NumStrs != 1)
621     memcpy(&SL->TokLocs[1], Loc+1, sizeof(SourceLocation)*(NumStrs-1));
622   return SL;
623 }
624 
625 StringLiteral *StringLiteral::CreateEmpty(ASTContext &C, unsigned NumStrs) {
626   void *Mem = C.Allocate(sizeof(StringLiteral)+
627                          sizeof(SourceLocation)*(NumStrs-1),
628                          llvm::alignOf<StringLiteral>());
629   StringLiteral *SL = new (Mem) StringLiteral(QualType());
630   SL->CharByteWidth = 0;
631   SL->Length = 0;
632   SL->NumConcatenated = NumStrs;
633   return SL;
634 }
635 
636 void StringLiteral::setString(ASTContext &C, StringRef Str,
637                               StringKind Kind, bool IsPascal) {
638   //FIXME: we assume that the string data comes from a target that uses the same
639   // code unit size and endianess for the type of string.
640   this->Kind = Kind;
641   this->IsPascal = IsPascal;
642 
643   CharByteWidth = mapCharByteWidth(C.getTargetInfo(),Kind);
644   assert((Str.size()%CharByteWidth == 0)
645          && "size of data must be multiple of CharByteWidth");
646   Length = Str.size()/CharByteWidth;
647 
648   switch(CharByteWidth) {
649     case 1: {
650       char *AStrData = new (C) char[Length];
651       std::memcpy(AStrData,Str.data(),Str.size());
652       StrData.asChar = AStrData;
653       break;
654     }
655     case 2: {
656       uint16_t *AStrData = new (C) uint16_t[Length];
657       std::memcpy(AStrData,Str.data(),Str.size());
658       StrData.asUInt16 = AStrData;
659       break;
660     }
661     case 4: {
662       uint32_t *AStrData = new (C) uint32_t[Length];
663       std::memcpy(AStrData,Str.data(),Str.size());
664       StrData.asUInt32 = AStrData;
665       break;
666     }
667     default:
668       assert(false && "unsupported CharByteWidth");
669   }
670 }
671 
672 /// getLocationOfByte - Return a source location that points to the specified
673 /// byte of this string literal.
674 ///
675 /// Strings are amazingly complex.  They can be formed from multiple tokens and
676 /// can have escape sequences in them in addition to the usual trigraph and
677 /// escaped newline business.  This routine handles this complexity.
678 ///
679 SourceLocation StringLiteral::
680 getLocationOfByte(unsigned ByteNo, const SourceManager &SM,
681                   const LangOptions &Features, const TargetInfo &Target) const {
682   assert(Kind == StringLiteral::Ascii && "This only works for ASCII strings");
683 
684   // Loop over all of the tokens in this string until we find the one that
685   // contains the byte we're looking for.
686   unsigned TokNo = 0;
687   while (1) {
688     assert(TokNo < getNumConcatenated() && "Invalid byte number!");
689     SourceLocation StrTokLoc = getStrTokenLoc(TokNo);
690 
691     // Get the spelling of the string so that we can get the data that makes up
692     // the string literal, not the identifier for the macro it is potentially
693     // expanded through.
694     SourceLocation StrTokSpellingLoc = SM.getSpellingLoc(StrTokLoc);
695 
696     // Re-lex the token to get its length and original spelling.
697     std::pair<FileID, unsigned> LocInfo =SM.getDecomposedLoc(StrTokSpellingLoc);
698     bool Invalid = false;
699     StringRef Buffer = SM.getBufferData(LocInfo.first, &Invalid);
700     if (Invalid)
701       return StrTokSpellingLoc;
702 
703     const char *StrData = Buffer.data()+LocInfo.second;
704 
705     // Create a langops struct and enable trigraphs.  This is sufficient for
706     // relexing tokens.
707     LangOptions LangOpts;
708     LangOpts.Trigraphs = true;
709 
710     // Create a lexer starting at the beginning of this token.
711     Lexer TheLexer(SM.getLocForStartOfFile(LocInfo.first), Features,
712                    Buffer.begin(), StrData, Buffer.end());
713     Token TheTok;
714     TheLexer.LexFromRawLexer(TheTok);
715 
716     // Use the StringLiteralParser to compute the length of the string in bytes.
717     StringLiteralParser SLP(&TheTok, 1, SM, Features, Target);
718     unsigned TokNumBytes = SLP.GetStringLength();
719 
720     // If the byte is in this token, return the location of the byte.
721     if (ByteNo < TokNumBytes ||
722         (ByteNo == TokNumBytes && TokNo == getNumConcatenated() - 1)) {
723       unsigned Offset = SLP.getOffsetOfStringByte(TheTok, ByteNo);
724 
725       // Now that we know the offset of the token in the spelling, use the
726       // preprocessor to get the offset in the original source.
727       return Lexer::AdvanceToTokenCharacter(StrTokLoc, Offset, SM, Features);
728     }
729 
730     // Move to the next string token.
731     ++TokNo;
732     ByteNo -= TokNumBytes;
733   }
734 }
735 
736 
737 
738 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
739 /// corresponds to, e.g. "sizeof" or "[pre]++".
740 const char *UnaryOperator::getOpcodeStr(Opcode Op) {
741   switch (Op) {
742   case UO_PostInc: return "++";
743   case UO_PostDec: return "--";
744   case UO_PreInc:  return "++";
745   case UO_PreDec:  return "--";
746   case UO_AddrOf:  return "&";
747   case UO_Deref:   return "*";
748   case UO_Plus:    return "+";
749   case UO_Minus:   return "-";
750   case UO_Not:     return "~";
751   case UO_LNot:    return "!";
752   case UO_Real:    return "__real";
753   case UO_Imag:    return "__imag";
754   case UO_Extension: return "__extension__";
755   }
756   llvm_unreachable("Unknown unary operator");
757 }
758 
759 UnaryOperatorKind
760 UnaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO, bool Postfix) {
761   switch (OO) {
762   default: llvm_unreachable("No unary operator for overloaded function");
763   case OO_PlusPlus:   return Postfix ? UO_PostInc : UO_PreInc;
764   case OO_MinusMinus: return Postfix ? UO_PostDec : UO_PreDec;
765   case OO_Amp:        return UO_AddrOf;
766   case OO_Star:       return UO_Deref;
767   case OO_Plus:       return UO_Plus;
768   case OO_Minus:      return UO_Minus;
769   case OO_Tilde:      return UO_Not;
770   case OO_Exclaim:    return UO_LNot;
771   }
772 }
773 
774 OverloadedOperatorKind UnaryOperator::getOverloadedOperator(Opcode Opc) {
775   switch (Opc) {
776   case UO_PostInc: case UO_PreInc: return OO_PlusPlus;
777   case UO_PostDec: case UO_PreDec: return OO_MinusMinus;
778   case UO_AddrOf: return OO_Amp;
779   case UO_Deref: return OO_Star;
780   case UO_Plus: return OO_Plus;
781   case UO_Minus: return OO_Minus;
782   case UO_Not: return OO_Tilde;
783   case UO_LNot: return OO_Exclaim;
784   default: return OO_None;
785   }
786 }
787 
788 
789 //===----------------------------------------------------------------------===//
790 // Postfix Operators.
791 //===----------------------------------------------------------------------===//
792 
793 CallExpr::CallExpr(ASTContext& C, StmtClass SC, Expr *fn, unsigned NumPreArgs,
794                    Expr **args, unsigned numargs, QualType t, ExprValueKind VK,
795                    SourceLocation rparenloc)
796   : Expr(SC, t, VK, OK_Ordinary,
797          fn->isTypeDependent(),
798          fn->isValueDependent(),
799          fn->isInstantiationDependent(),
800          fn->containsUnexpandedParameterPack()),
801     NumArgs(numargs) {
802 
803   SubExprs = new (C) Stmt*[numargs+PREARGS_START+NumPreArgs];
804   SubExprs[FN] = fn;
805   for (unsigned i = 0; i != numargs; ++i) {
806     if (args[i]->isTypeDependent())
807       ExprBits.TypeDependent = true;
808     if (args[i]->isValueDependent())
809       ExprBits.ValueDependent = true;
810     if (args[i]->isInstantiationDependent())
811       ExprBits.InstantiationDependent = true;
812     if (args[i]->containsUnexpandedParameterPack())
813       ExprBits.ContainsUnexpandedParameterPack = true;
814 
815     SubExprs[i+PREARGS_START+NumPreArgs] = args[i];
816   }
817 
818   CallExprBits.NumPreArgs = NumPreArgs;
819   RParenLoc = rparenloc;
820 }
821 
822 CallExpr::CallExpr(ASTContext& C, Expr *fn, Expr **args, unsigned numargs,
823                    QualType t, ExprValueKind VK, SourceLocation rparenloc)
824   : Expr(CallExprClass, t, VK, OK_Ordinary,
825          fn->isTypeDependent(),
826          fn->isValueDependent(),
827          fn->isInstantiationDependent(),
828          fn->containsUnexpandedParameterPack()),
829     NumArgs(numargs) {
830 
831   SubExprs = new (C) Stmt*[numargs+PREARGS_START];
832   SubExprs[FN] = fn;
833   for (unsigned i = 0; i != numargs; ++i) {
834     if (args[i]->isTypeDependent())
835       ExprBits.TypeDependent = true;
836     if (args[i]->isValueDependent())
837       ExprBits.ValueDependent = true;
838     if (args[i]->isInstantiationDependent())
839       ExprBits.InstantiationDependent = true;
840     if (args[i]->containsUnexpandedParameterPack())
841       ExprBits.ContainsUnexpandedParameterPack = true;
842 
843     SubExprs[i+PREARGS_START] = args[i];
844   }
845 
846   CallExprBits.NumPreArgs = 0;
847   RParenLoc = rparenloc;
848 }
849 
850 CallExpr::CallExpr(ASTContext &C, StmtClass SC, EmptyShell Empty)
851   : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
852   // FIXME: Why do we allocate this?
853   SubExprs = new (C) Stmt*[PREARGS_START];
854   CallExprBits.NumPreArgs = 0;
855 }
856 
857 CallExpr::CallExpr(ASTContext &C, StmtClass SC, unsigned NumPreArgs,
858                    EmptyShell Empty)
859   : Expr(SC, Empty), SubExprs(0), NumArgs(0) {
860   // FIXME: Why do we allocate this?
861   SubExprs = new (C) Stmt*[PREARGS_START+NumPreArgs];
862   CallExprBits.NumPreArgs = NumPreArgs;
863 }
864 
865 Decl *CallExpr::getCalleeDecl() {
866   Expr *CEE = getCallee()->IgnoreParenImpCasts();
867 
868   while (SubstNonTypeTemplateParmExpr *NTTP
869                                 = dyn_cast<SubstNonTypeTemplateParmExpr>(CEE)) {
870     CEE = NTTP->getReplacement()->IgnoreParenCasts();
871   }
872 
873   // If we're calling a dereference, look at the pointer instead.
874   if (BinaryOperator *BO = dyn_cast<BinaryOperator>(CEE)) {
875     if (BO->isPtrMemOp())
876       CEE = BO->getRHS()->IgnoreParenCasts();
877   } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(CEE)) {
878     if (UO->getOpcode() == UO_Deref)
879       CEE = UO->getSubExpr()->IgnoreParenCasts();
880   }
881   if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(CEE))
882     return DRE->getDecl();
883   if (MemberExpr *ME = dyn_cast<MemberExpr>(CEE))
884     return ME->getMemberDecl();
885 
886   return 0;
887 }
888 
889 FunctionDecl *CallExpr::getDirectCallee() {
890   return dyn_cast_or_null<FunctionDecl>(getCalleeDecl());
891 }
892 
893 /// setNumArgs - This changes the number of arguments present in this call.
894 /// Any orphaned expressions are deleted by this, and any new operands are set
895 /// to null.
896 void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
897   // No change, just return.
898   if (NumArgs == getNumArgs()) return;
899 
900   // If shrinking # arguments, just delete the extras and forgot them.
901   if (NumArgs < getNumArgs()) {
902     this->NumArgs = NumArgs;
903     return;
904   }
905 
906   // Otherwise, we are growing the # arguments.  New an bigger argument array.
907   unsigned NumPreArgs = getNumPreArgs();
908   Stmt **NewSubExprs = new (C) Stmt*[NumArgs+PREARGS_START+NumPreArgs];
909   // Copy over args.
910   for (unsigned i = 0; i != getNumArgs()+PREARGS_START+NumPreArgs; ++i)
911     NewSubExprs[i] = SubExprs[i];
912   // Null out new args.
913   for (unsigned i = getNumArgs()+PREARGS_START+NumPreArgs;
914        i != NumArgs+PREARGS_START+NumPreArgs; ++i)
915     NewSubExprs[i] = 0;
916 
917   if (SubExprs) C.Deallocate(SubExprs);
918   SubExprs = NewSubExprs;
919   this->NumArgs = NumArgs;
920 }
921 
922 /// isBuiltinCall - If this is a call to a builtin, return the builtin ID.  If
923 /// not, return 0.
924 unsigned CallExpr::isBuiltinCall() const {
925   // All simple function calls (e.g. func()) are implicitly cast to pointer to
926   // function. As a result, we try and obtain the DeclRefExpr from the
927   // ImplicitCastExpr.
928   const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(getCallee());
929   if (!ICE) // FIXME: deal with more complex calls (e.g. (func)(), (*func)()).
930     return 0;
931 
932   const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(ICE->getSubExpr());
933   if (!DRE)
934     return 0;
935 
936   const FunctionDecl *FDecl = dyn_cast<FunctionDecl>(DRE->getDecl());
937   if (!FDecl)
938     return 0;
939 
940   if (!FDecl->getIdentifier())
941     return 0;
942 
943   return FDecl->getBuiltinID();
944 }
945 
946 QualType CallExpr::getCallReturnType() const {
947   QualType CalleeType = getCallee()->getType();
948   if (const PointerType *FnTypePtr = CalleeType->getAs<PointerType>())
949     CalleeType = FnTypePtr->getPointeeType();
950   else if (const BlockPointerType *BPT = CalleeType->getAs<BlockPointerType>())
951     CalleeType = BPT->getPointeeType();
952   else if (CalleeType->isSpecificPlaceholderType(BuiltinType::BoundMember))
953     // This should never be overloaded and so should never return null.
954     CalleeType = Expr::findBoundMemberType(getCallee());
955 
956   const FunctionType *FnType = CalleeType->castAs<FunctionType>();
957   return FnType->getResultType();
958 }
959 
960 SourceRange CallExpr::getSourceRange() const {
961   if (isa<CXXOperatorCallExpr>(this))
962     return cast<CXXOperatorCallExpr>(this)->getSourceRange();
963 
964   SourceLocation begin = getCallee()->getLocStart();
965   if (begin.isInvalid() && getNumArgs() > 0)
966     begin = getArg(0)->getLocStart();
967   SourceLocation end = getRParenLoc();
968   if (end.isInvalid() && getNumArgs() > 0)
969     end = getArg(getNumArgs() - 1)->getLocEnd();
970   return SourceRange(begin, end);
971 }
972 SourceLocation CallExpr::getLocStart() const {
973   if (isa<CXXOperatorCallExpr>(this))
974     return cast<CXXOperatorCallExpr>(this)->getSourceRange().getBegin();
975 
976   SourceLocation begin = getCallee()->getLocStart();
977   if (begin.isInvalid() && getNumArgs() > 0)
978     begin = getArg(0)->getLocStart();
979   return begin;
980 }
981 SourceLocation CallExpr::getLocEnd() const {
982   if (isa<CXXOperatorCallExpr>(this))
983     return cast<CXXOperatorCallExpr>(this)->getSourceRange().getEnd();
984 
985   SourceLocation end = getRParenLoc();
986   if (end.isInvalid() && getNumArgs() > 0)
987     end = getArg(getNumArgs() - 1)->getLocEnd();
988   return end;
989 }
990 
991 OffsetOfExpr *OffsetOfExpr::Create(ASTContext &C, QualType type,
992                                    SourceLocation OperatorLoc,
993                                    TypeSourceInfo *tsi,
994                                    OffsetOfNode* compsPtr, unsigned numComps,
995                                    Expr** exprsPtr, unsigned numExprs,
996                                    SourceLocation RParenLoc) {
997   void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
998                          sizeof(OffsetOfNode) * numComps +
999                          sizeof(Expr*) * numExprs);
1000 
1001   return new (Mem) OffsetOfExpr(C, type, OperatorLoc, tsi, compsPtr, numComps,
1002                                 exprsPtr, numExprs, RParenLoc);
1003 }
1004 
1005 OffsetOfExpr *OffsetOfExpr::CreateEmpty(ASTContext &C,
1006                                         unsigned numComps, unsigned numExprs) {
1007   void *Mem = C.Allocate(sizeof(OffsetOfExpr) +
1008                          sizeof(OffsetOfNode) * numComps +
1009                          sizeof(Expr*) * numExprs);
1010   return new (Mem) OffsetOfExpr(numComps, numExprs);
1011 }
1012 
1013 OffsetOfExpr::OffsetOfExpr(ASTContext &C, QualType type,
1014                            SourceLocation OperatorLoc, TypeSourceInfo *tsi,
1015                            OffsetOfNode* compsPtr, unsigned numComps,
1016                            Expr** exprsPtr, unsigned numExprs,
1017                            SourceLocation RParenLoc)
1018   : Expr(OffsetOfExprClass, type, VK_RValue, OK_Ordinary,
1019          /*TypeDependent=*/false,
1020          /*ValueDependent=*/tsi->getType()->isDependentType(),
1021          tsi->getType()->isInstantiationDependentType(),
1022          tsi->getType()->containsUnexpandedParameterPack()),
1023     OperatorLoc(OperatorLoc), RParenLoc(RParenLoc), TSInfo(tsi),
1024     NumComps(numComps), NumExprs(numExprs)
1025 {
1026   for(unsigned i = 0; i < numComps; ++i) {
1027     setComponent(i, compsPtr[i]);
1028   }
1029 
1030   for(unsigned i = 0; i < numExprs; ++i) {
1031     if (exprsPtr[i]->isTypeDependent() || exprsPtr[i]->isValueDependent())
1032       ExprBits.ValueDependent = true;
1033     if (exprsPtr[i]->containsUnexpandedParameterPack())
1034       ExprBits.ContainsUnexpandedParameterPack = true;
1035 
1036     setIndexExpr(i, exprsPtr[i]);
1037   }
1038 }
1039 
1040 IdentifierInfo *OffsetOfExpr::OffsetOfNode::getFieldName() const {
1041   assert(getKind() == Field || getKind() == Identifier);
1042   if (getKind() == Field)
1043     return getField()->getIdentifier();
1044 
1045   return reinterpret_cast<IdentifierInfo *> (Data & ~(uintptr_t)Mask);
1046 }
1047 
1048 MemberExpr *MemberExpr::Create(ASTContext &C, Expr *base, bool isarrow,
1049                                NestedNameSpecifierLoc QualifierLoc,
1050                                SourceLocation TemplateKWLoc,
1051                                ValueDecl *memberdecl,
1052                                DeclAccessPair founddecl,
1053                                DeclarationNameInfo nameinfo,
1054                                const TemplateArgumentListInfo *targs,
1055                                QualType ty,
1056                                ExprValueKind vk,
1057                                ExprObjectKind ok) {
1058   std::size_t Size = sizeof(MemberExpr);
1059 
1060   bool hasQualOrFound = (QualifierLoc ||
1061                          founddecl.getDecl() != memberdecl ||
1062                          founddecl.getAccess() != memberdecl->getAccess());
1063   if (hasQualOrFound)
1064     Size += sizeof(MemberNameQualifier);
1065 
1066   if (targs)
1067     Size += ASTTemplateKWAndArgsInfo::sizeFor(targs->size());
1068   else if (TemplateKWLoc.isValid())
1069     Size += ASTTemplateKWAndArgsInfo::sizeFor(0);
1070 
1071   void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
1072   MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
1073                                        ty, vk, ok);
1074 
1075   if (hasQualOrFound) {
1076     // FIXME: Wrong. We should be looking at the member declaration we found.
1077     if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1078       E->setValueDependent(true);
1079       E->setTypeDependent(true);
1080       E->setInstantiationDependent(true);
1081     }
1082     else if (QualifierLoc &&
1083              QualifierLoc.getNestedNameSpecifier()->isInstantiationDependent())
1084       E->setInstantiationDependent(true);
1085 
1086     E->HasQualifierOrFoundDecl = true;
1087 
1088     MemberNameQualifier *NQ = E->getMemberQualifier();
1089     NQ->QualifierLoc = QualifierLoc;
1090     NQ->FoundDecl = founddecl;
1091   }
1092 
1093   E->HasTemplateKWAndArgsInfo = (targs || TemplateKWLoc.isValid());
1094 
1095   if (targs) {
1096     bool Dependent = false;
1097     bool InstantiationDependent = false;
1098     bool ContainsUnexpandedParameterPack = false;
1099     E->getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc, *targs,
1100                                                   Dependent,
1101                                                   InstantiationDependent,
1102                                              ContainsUnexpandedParameterPack);
1103     if (InstantiationDependent)
1104       E->setInstantiationDependent(true);
1105   } else if (TemplateKWLoc.isValid()) {
1106     E->getTemplateKWAndArgsInfo()->initializeFrom(TemplateKWLoc);
1107   }
1108 
1109   return E;
1110 }
1111 
1112 SourceRange MemberExpr::getSourceRange() const {
1113   return SourceRange(getLocStart(), getLocEnd());
1114 }
1115 SourceLocation MemberExpr::getLocStart() const {
1116   if (isImplicitAccess()) {
1117     if (hasQualifier())
1118       return getQualifierLoc().getBeginLoc();
1119     return MemberLoc;
1120   }
1121 
1122   // FIXME: We don't want this to happen. Rather, we should be able to
1123   // detect all kinds of implicit accesses more cleanly.
1124   SourceLocation BaseStartLoc = getBase()->getLocStart();
1125   if (BaseStartLoc.isValid())
1126     return BaseStartLoc;
1127   return MemberLoc;
1128 }
1129 SourceLocation MemberExpr::getLocEnd() const {
1130   if (hasExplicitTemplateArgs())
1131     return getRAngleLoc();
1132   return getMemberNameInfo().getEndLoc();
1133 }
1134 
1135 void CastExpr::CheckCastConsistency() const {
1136   switch (getCastKind()) {
1137   case CK_DerivedToBase:
1138   case CK_UncheckedDerivedToBase:
1139   case CK_DerivedToBaseMemberPointer:
1140   case CK_BaseToDerived:
1141   case CK_BaseToDerivedMemberPointer:
1142     assert(!path_empty() && "Cast kind should have a base path!");
1143     break;
1144 
1145   case CK_CPointerToObjCPointerCast:
1146     assert(getType()->isObjCObjectPointerType());
1147     assert(getSubExpr()->getType()->isPointerType());
1148     goto CheckNoBasePath;
1149 
1150   case CK_BlockPointerToObjCPointerCast:
1151     assert(getType()->isObjCObjectPointerType());
1152     assert(getSubExpr()->getType()->isBlockPointerType());
1153     goto CheckNoBasePath;
1154 
1155   case CK_ReinterpretMemberPointer:
1156     assert(getType()->isMemberPointerType());
1157     assert(getSubExpr()->getType()->isMemberPointerType());
1158     goto CheckNoBasePath;
1159 
1160   case CK_BitCast:
1161     // Arbitrary casts to C pointer types count as bitcasts.
1162     // Otherwise, we should only have block and ObjC pointer casts
1163     // here if they stay within the type kind.
1164     if (!getType()->isPointerType()) {
1165       assert(getType()->isObjCObjectPointerType() ==
1166              getSubExpr()->getType()->isObjCObjectPointerType());
1167       assert(getType()->isBlockPointerType() ==
1168              getSubExpr()->getType()->isBlockPointerType());
1169     }
1170     goto CheckNoBasePath;
1171 
1172   case CK_AnyPointerToBlockPointerCast:
1173     assert(getType()->isBlockPointerType());
1174     assert(getSubExpr()->getType()->isAnyPointerType() &&
1175            !getSubExpr()->getType()->isBlockPointerType());
1176     goto CheckNoBasePath;
1177 
1178   case CK_CopyAndAutoreleaseBlockObject:
1179     assert(getType()->isBlockPointerType());
1180     assert(getSubExpr()->getType()->isBlockPointerType());
1181     goto CheckNoBasePath;
1182 
1183   // These should not have an inheritance path.
1184   case CK_Dynamic:
1185   case CK_ToUnion:
1186   case CK_ArrayToPointerDecay:
1187   case CK_FunctionToPointerDecay:
1188   case CK_NullToMemberPointer:
1189   case CK_NullToPointer:
1190   case CK_ConstructorConversion:
1191   case CK_IntegralToPointer:
1192   case CK_PointerToIntegral:
1193   case CK_ToVoid:
1194   case CK_VectorSplat:
1195   case CK_IntegralCast:
1196   case CK_IntegralToFloating:
1197   case CK_FloatingToIntegral:
1198   case CK_FloatingCast:
1199   case CK_ObjCObjectLValueCast:
1200   case CK_FloatingRealToComplex:
1201   case CK_FloatingComplexToReal:
1202   case CK_FloatingComplexCast:
1203   case CK_FloatingComplexToIntegralComplex:
1204   case CK_IntegralRealToComplex:
1205   case CK_IntegralComplexToReal:
1206   case CK_IntegralComplexCast:
1207   case CK_IntegralComplexToFloatingComplex:
1208   case CK_ARCProduceObject:
1209   case CK_ARCConsumeObject:
1210   case CK_ARCReclaimReturnedObject:
1211   case CK_ARCExtendBlockObject:
1212     assert(!getType()->isBooleanType() && "unheralded conversion to bool");
1213     goto CheckNoBasePath;
1214 
1215   case CK_Dependent:
1216   case CK_LValueToRValue:
1217   case CK_NoOp:
1218   case CK_AtomicToNonAtomic:
1219   case CK_NonAtomicToAtomic:
1220   case CK_PointerToBoolean:
1221   case CK_IntegralToBoolean:
1222   case CK_FloatingToBoolean:
1223   case CK_MemberPointerToBoolean:
1224   case CK_FloatingComplexToBoolean:
1225   case CK_IntegralComplexToBoolean:
1226   case CK_LValueBitCast:            // -> bool&
1227   case CK_UserDefinedConversion:    // operator bool()
1228   CheckNoBasePath:
1229     assert(path_empty() && "Cast kind should not have a base path!");
1230     break;
1231   }
1232 }
1233 
1234 const char *CastExpr::getCastKindName() const {
1235   switch (getCastKind()) {
1236   case CK_Dependent:
1237     return "Dependent";
1238   case CK_BitCast:
1239     return "BitCast";
1240   case CK_LValueBitCast:
1241     return "LValueBitCast";
1242   case CK_LValueToRValue:
1243     return "LValueToRValue";
1244   case CK_NoOp:
1245     return "NoOp";
1246   case CK_BaseToDerived:
1247     return "BaseToDerived";
1248   case CK_DerivedToBase:
1249     return "DerivedToBase";
1250   case CK_UncheckedDerivedToBase:
1251     return "UncheckedDerivedToBase";
1252   case CK_Dynamic:
1253     return "Dynamic";
1254   case CK_ToUnion:
1255     return "ToUnion";
1256   case CK_ArrayToPointerDecay:
1257     return "ArrayToPointerDecay";
1258   case CK_FunctionToPointerDecay:
1259     return "FunctionToPointerDecay";
1260   case CK_NullToMemberPointer:
1261     return "NullToMemberPointer";
1262   case CK_NullToPointer:
1263     return "NullToPointer";
1264   case CK_BaseToDerivedMemberPointer:
1265     return "BaseToDerivedMemberPointer";
1266   case CK_DerivedToBaseMemberPointer:
1267     return "DerivedToBaseMemberPointer";
1268   case CK_ReinterpretMemberPointer:
1269     return "ReinterpretMemberPointer";
1270   case CK_UserDefinedConversion:
1271     return "UserDefinedConversion";
1272   case CK_ConstructorConversion:
1273     return "ConstructorConversion";
1274   case CK_IntegralToPointer:
1275     return "IntegralToPointer";
1276   case CK_PointerToIntegral:
1277     return "PointerToIntegral";
1278   case CK_PointerToBoolean:
1279     return "PointerToBoolean";
1280   case CK_ToVoid:
1281     return "ToVoid";
1282   case CK_VectorSplat:
1283     return "VectorSplat";
1284   case CK_IntegralCast:
1285     return "IntegralCast";
1286   case CK_IntegralToBoolean:
1287     return "IntegralToBoolean";
1288   case CK_IntegralToFloating:
1289     return "IntegralToFloating";
1290   case CK_FloatingToIntegral:
1291     return "FloatingToIntegral";
1292   case CK_FloatingCast:
1293     return "FloatingCast";
1294   case CK_FloatingToBoolean:
1295     return "FloatingToBoolean";
1296   case CK_MemberPointerToBoolean:
1297     return "MemberPointerToBoolean";
1298   case CK_CPointerToObjCPointerCast:
1299     return "CPointerToObjCPointerCast";
1300   case CK_BlockPointerToObjCPointerCast:
1301     return "BlockPointerToObjCPointerCast";
1302   case CK_AnyPointerToBlockPointerCast:
1303     return "AnyPointerToBlockPointerCast";
1304   case CK_ObjCObjectLValueCast:
1305     return "ObjCObjectLValueCast";
1306   case CK_FloatingRealToComplex:
1307     return "FloatingRealToComplex";
1308   case CK_FloatingComplexToReal:
1309     return "FloatingComplexToReal";
1310   case CK_FloatingComplexToBoolean:
1311     return "FloatingComplexToBoolean";
1312   case CK_FloatingComplexCast:
1313     return "FloatingComplexCast";
1314   case CK_FloatingComplexToIntegralComplex:
1315     return "FloatingComplexToIntegralComplex";
1316   case CK_IntegralRealToComplex:
1317     return "IntegralRealToComplex";
1318   case CK_IntegralComplexToReal:
1319     return "IntegralComplexToReal";
1320   case CK_IntegralComplexToBoolean:
1321     return "IntegralComplexToBoolean";
1322   case CK_IntegralComplexCast:
1323     return "IntegralComplexCast";
1324   case CK_IntegralComplexToFloatingComplex:
1325     return "IntegralComplexToFloatingComplex";
1326   case CK_ARCConsumeObject:
1327     return "ARCConsumeObject";
1328   case CK_ARCProduceObject:
1329     return "ARCProduceObject";
1330   case CK_ARCReclaimReturnedObject:
1331     return "ARCReclaimReturnedObject";
1332   case CK_ARCExtendBlockObject:
1333     return "ARCCExtendBlockObject";
1334   case CK_AtomicToNonAtomic:
1335     return "AtomicToNonAtomic";
1336   case CK_NonAtomicToAtomic:
1337     return "NonAtomicToAtomic";
1338   case CK_CopyAndAutoreleaseBlockObject:
1339     return "CopyAndAutoreleaseBlockObject";
1340   }
1341 
1342   llvm_unreachable("Unhandled cast kind!");
1343 }
1344 
1345 Expr *CastExpr::getSubExprAsWritten() {
1346   Expr *SubExpr = 0;
1347   CastExpr *E = this;
1348   do {
1349     SubExpr = E->getSubExpr();
1350 
1351     // Skip through reference binding to temporary.
1352     if (MaterializeTemporaryExpr *Materialize
1353                                   = dyn_cast<MaterializeTemporaryExpr>(SubExpr))
1354       SubExpr = Materialize->GetTemporaryExpr();
1355 
1356     // Skip any temporary bindings; they're implicit.
1357     if (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(SubExpr))
1358       SubExpr = Binder->getSubExpr();
1359 
1360     // Conversions by constructor and conversion functions have a
1361     // subexpression describing the call; strip it off.
1362     if (E->getCastKind() == CK_ConstructorConversion)
1363       SubExpr = cast<CXXConstructExpr>(SubExpr)->getArg(0);
1364     else if (E->getCastKind() == CK_UserDefinedConversion)
1365       SubExpr = cast<CXXMemberCallExpr>(SubExpr)->getImplicitObjectArgument();
1366 
1367     // If the subexpression we're left with is an implicit cast, look
1368     // through that, too.
1369   } while ((E = dyn_cast<ImplicitCastExpr>(SubExpr)));
1370 
1371   return SubExpr;
1372 }
1373 
1374 CXXBaseSpecifier **CastExpr::path_buffer() {
1375   switch (getStmtClass()) {
1376 #define ABSTRACT_STMT(x)
1377 #define CASTEXPR(Type, Base) \
1378   case Stmt::Type##Class: \
1379     return reinterpret_cast<CXXBaseSpecifier**>(static_cast<Type*>(this)+1);
1380 #define STMT(Type, Base)
1381 #include "clang/AST/StmtNodes.inc"
1382   default:
1383     llvm_unreachable("non-cast expressions not possible here");
1384   }
1385 }
1386 
1387 void CastExpr::setCastPath(const CXXCastPath &Path) {
1388   assert(Path.size() == path_size());
1389   memcpy(path_buffer(), Path.data(), Path.size() * sizeof(CXXBaseSpecifier*));
1390 }
1391 
1392 ImplicitCastExpr *ImplicitCastExpr::Create(ASTContext &C, QualType T,
1393                                            CastKind Kind, Expr *Operand,
1394                                            const CXXCastPath *BasePath,
1395                                            ExprValueKind VK) {
1396   unsigned PathSize = (BasePath ? BasePath->size() : 0);
1397   void *Buffer =
1398     C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1399   ImplicitCastExpr *E =
1400     new (Buffer) ImplicitCastExpr(T, Kind, Operand, PathSize, VK);
1401   if (PathSize) E->setCastPath(*BasePath);
1402   return E;
1403 }
1404 
1405 ImplicitCastExpr *ImplicitCastExpr::CreateEmpty(ASTContext &C,
1406                                                 unsigned PathSize) {
1407   void *Buffer =
1408     C.Allocate(sizeof(ImplicitCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1409   return new (Buffer) ImplicitCastExpr(EmptyShell(), PathSize);
1410 }
1411 
1412 
1413 CStyleCastExpr *CStyleCastExpr::Create(ASTContext &C, QualType T,
1414                                        ExprValueKind VK, CastKind K, Expr *Op,
1415                                        const CXXCastPath *BasePath,
1416                                        TypeSourceInfo *WrittenTy,
1417                                        SourceLocation L, SourceLocation R) {
1418   unsigned PathSize = (BasePath ? BasePath->size() : 0);
1419   void *Buffer =
1420     C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1421   CStyleCastExpr *E =
1422     new (Buffer) CStyleCastExpr(T, VK, K, Op, PathSize, WrittenTy, L, R);
1423   if (PathSize) E->setCastPath(*BasePath);
1424   return E;
1425 }
1426 
1427 CStyleCastExpr *CStyleCastExpr::CreateEmpty(ASTContext &C, unsigned PathSize) {
1428   void *Buffer =
1429     C.Allocate(sizeof(CStyleCastExpr) + PathSize * sizeof(CXXBaseSpecifier*));
1430   return new (Buffer) CStyleCastExpr(EmptyShell(), PathSize);
1431 }
1432 
1433 /// getOpcodeStr - Turn an Opcode enum value into the punctuation char it
1434 /// corresponds to, e.g. "<<=".
1435 const char *BinaryOperator::getOpcodeStr(Opcode Op) {
1436   switch (Op) {
1437   case BO_PtrMemD:   return ".*";
1438   case BO_PtrMemI:   return "->*";
1439   case BO_Mul:       return "*";
1440   case BO_Div:       return "/";
1441   case BO_Rem:       return "%";
1442   case BO_Add:       return "+";
1443   case BO_Sub:       return "-";
1444   case BO_Shl:       return "<<";
1445   case BO_Shr:       return ">>";
1446   case BO_LT:        return "<";
1447   case BO_GT:        return ">";
1448   case BO_LE:        return "<=";
1449   case BO_GE:        return ">=";
1450   case BO_EQ:        return "==";
1451   case BO_NE:        return "!=";
1452   case BO_And:       return "&";
1453   case BO_Xor:       return "^";
1454   case BO_Or:        return "|";
1455   case BO_LAnd:      return "&&";
1456   case BO_LOr:       return "||";
1457   case BO_Assign:    return "=";
1458   case BO_MulAssign: return "*=";
1459   case BO_DivAssign: return "/=";
1460   case BO_RemAssign: return "%=";
1461   case BO_AddAssign: return "+=";
1462   case BO_SubAssign: return "-=";
1463   case BO_ShlAssign: return "<<=";
1464   case BO_ShrAssign: return ">>=";
1465   case BO_AndAssign: return "&=";
1466   case BO_XorAssign: return "^=";
1467   case BO_OrAssign:  return "|=";
1468   case BO_Comma:     return ",";
1469   }
1470 
1471   llvm_unreachable("Invalid OpCode!");
1472 }
1473 
1474 BinaryOperatorKind
1475 BinaryOperator::getOverloadedOpcode(OverloadedOperatorKind OO) {
1476   switch (OO) {
1477   default: llvm_unreachable("Not an overloadable binary operator");
1478   case OO_Plus: return BO_Add;
1479   case OO_Minus: return BO_Sub;
1480   case OO_Star: return BO_Mul;
1481   case OO_Slash: return BO_Div;
1482   case OO_Percent: return BO_Rem;
1483   case OO_Caret: return BO_Xor;
1484   case OO_Amp: return BO_And;
1485   case OO_Pipe: return BO_Or;
1486   case OO_Equal: return BO_Assign;
1487   case OO_Less: return BO_LT;
1488   case OO_Greater: return BO_GT;
1489   case OO_PlusEqual: return BO_AddAssign;
1490   case OO_MinusEqual: return BO_SubAssign;
1491   case OO_StarEqual: return BO_MulAssign;
1492   case OO_SlashEqual: return BO_DivAssign;
1493   case OO_PercentEqual: return BO_RemAssign;
1494   case OO_CaretEqual: return BO_XorAssign;
1495   case OO_AmpEqual: return BO_AndAssign;
1496   case OO_PipeEqual: return BO_OrAssign;
1497   case OO_LessLess: return BO_Shl;
1498   case OO_GreaterGreater: return BO_Shr;
1499   case OO_LessLessEqual: return BO_ShlAssign;
1500   case OO_GreaterGreaterEqual: return BO_ShrAssign;
1501   case OO_EqualEqual: return BO_EQ;
1502   case OO_ExclaimEqual: return BO_NE;
1503   case OO_LessEqual: return BO_LE;
1504   case OO_GreaterEqual: return BO_GE;
1505   case OO_AmpAmp: return BO_LAnd;
1506   case OO_PipePipe: return BO_LOr;
1507   case OO_Comma: return BO_Comma;
1508   case OO_ArrowStar: return BO_PtrMemI;
1509   }
1510 }
1511 
1512 OverloadedOperatorKind BinaryOperator::getOverloadedOperator(Opcode Opc) {
1513   static const OverloadedOperatorKind OverOps[] = {
1514     /* .* Cannot be overloaded */OO_None, OO_ArrowStar,
1515     OO_Star, OO_Slash, OO_Percent,
1516     OO_Plus, OO_Minus,
1517     OO_LessLess, OO_GreaterGreater,
1518     OO_Less, OO_Greater, OO_LessEqual, OO_GreaterEqual,
1519     OO_EqualEqual, OO_ExclaimEqual,
1520     OO_Amp,
1521     OO_Caret,
1522     OO_Pipe,
1523     OO_AmpAmp,
1524     OO_PipePipe,
1525     OO_Equal, OO_StarEqual,
1526     OO_SlashEqual, OO_PercentEqual,
1527     OO_PlusEqual, OO_MinusEqual,
1528     OO_LessLessEqual, OO_GreaterGreaterEqual,
1529     OO_AmpEqual, OO_CaretEqual,
1530     OO_PipeEqual,
1531     OO_Comma
1532   };
1533   return OverOps[Opc];
1534 }
1535 
1536 InitListExpr::InitListExpr(ASTContext &C, SourceLocation lbraceloc,
1537                            Expr **initExprs, unsigned numInits,
1538                            SourceLocation rbraceloc)
1539   : Expr(InitListExprClass, QualType(), VK_RValue, OK_Ordinary, false, false,
1540          false, false),
1541     InitExprs(C, numInits),
1542     LBraceLoc(lbraceloc), RBraceLoc(rbraceloc), SyntacticForm(0)
1543 {
1544   sawArrayRangeDesignator(false);
1545   setInitializesStdInitializerList(false);
1546   for (unsigned I = 0; I != numInits; ++I) {
1547     if (initExprs[I]->isTypeDependent())
1548       ExprBits.TypeDependent = true;
1549     if (initExprs[I]->isValueDependent())
1550       ExprBits.ValueDependent = true;
1551     if (initExprs[I]->isInstantiationDependent())
1552       ExprBits.InstantiationDependent = true;
1553     if (initExprs[I]->containsUnexpandedParameterPack())
1554       ExprBits.ContainsUnexpandedParameterPack = true;
1555   }
1556 
1557   InitExprs.insert(C, InitExprs.end(), initExprs, initExprs+numInits);
1558 }
1559 
1560 void InitListExpr::reserveInits(ASTContext &C, unsigned NumInits) {
1561   if (NumInits > InitExprs.size())
1562     InitExprs.reserve(C, NumInits);
1563 }
1564 
1565 void InitListExpr::resizeInits(ASTContext &C, unsigned NumInits) {
1566   InitExprs.resize(C, NumInits, 0);
1567 }
1568 
1569 Expr *InitListExpr::updateInit(ASTContext &C, unsigned Init, Expr *expr) {
1570   if (Init >= InitExprs.size()) {
1571     InitExprs.insert(C, InitExprs.end(), Init - InitExprs.size() + 1, 0);
1572     InitExprs.back() = expr;
1573     return 0;
1574   }
1575 
1576   Expr *Result = cast_or_null<Expr>(InitExprs[Init]);
1577   InitExprs[Init] = expr;
1578   return Result;
1579 }
1580 
1581 void InitListExpr::setArrayFiller(Expr *filler) {
1582   assert(!hasArrayFiller() && "Filler already set!");
1583   ArrayFillerOrUnionFieldInit = filler;
1584   // Fill out any "holes" in the array due to designated initializers.
1585   Expr **inits = getInits();
1586   for (unsigned i = 0, e = getNumInits(); i != e; ++i)
1587     if (inits[i] == 0)
1588       inits[i] = filler;
1589 }
1590 
1591 bool InitListExpr::isStringLiteralInit() const {
1592   if (getNumInits() != 1)
1593     return false;
1594   const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(getType());
1595   if (!CAT || !CAT->getElementType()->isIntegerType())
1596     return false;
1597   const Expr *Init = getInit(0)->IgnoreParenImpCasts();
1598   return isa<StringLiteral>(Init) || isa<ObjCEncodeExpr>(Init);
1599 }
1600 
1601 SourceRange InitListExpr::getSourceRange() const {
1602   if (SyntacticForm)
1603     return SyntacticForm->getSourceRange();
1604   SourceLocation Beg = LBraceLoc, End = RBraceLoc;
1605   if (Beg.isInvalid()) {
1606     // Find the first non-null initializer.
1607     for (InitExprsTy::const_iterator I = InitExprs.begin(),
1608                                      E = InitExprs.end();
1609       I != E; ++I) {
1610       if (Stmt *S = *I) {
1611         Beg = S->getLocStart();
1612         break;
1613       }
1614     }
1615   }
1616   if (End.isInvalid()) {
1617     // Find the first non-null initializer from the end.
1618     for (InitExprsTy::const_reverse_iterator I = InitExprs.rbegin(),
1619                                              E = InitExprs.rend();
1620       I != E; ++I) {
1621       if (Stmt *S = *I) {
1622         End = S->getSourceRange().getEnd();
1623         break;
1624       }
1625     }
1626   }
1627   return SourceRange(Beg, End);
1628 }
1629 
1630 /// getFunctionType - Return the underlying function type for this block.
1631 ///
1632 const FunctionProtoType *BlockExpr::getFunctionType() const {
1633   // The block pointer is never sugared, but the function type might be.
1634   return cast<BlockPointerType>(getType())
1635            ->getPointeeType()->castAs<FunctionProtoType>();
1636 }
1637 
1638 SourceLocation BlockExpr::getCaretLocation() const {
1639   return TheBlock->getCaretLocation();
1640 }
1641 const Stmt *BlockExpr::getBody() const {
1642   return TheBlock->getBody();
1643 }
1644 Stmt *BlockExpr::getBody() {
1645   return TheBlock->getBody();
1646 }
1647 
1648 
1649 //===----------------------------------------------------------------------===//
1650 // Generic Expression Routines
1651 //===----------------------------------------------------------------------===//
1652 
1653 /// isUnusedResultAWarning - Return true if this immediate expression should
1654 /// be warned about if the result is unused.  If so, fill in Loc and Ranges
1655 /// with location to warn on and the source range[s] to report with the
1656 /// warning.
1657 bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc,
1658                                   SourceRange &R1, SourceRange &R2,
1659                                   ASTContext &Ctx) const {
1660   // Don't warn if the expr is type dependent. The type could end up
1661   // instantiating to void.
1662   if (isTypeDependent())
1663     return false;
1664 
1665   switch (getStmtClass()) {
1666   default:
1667     if (getType()->isVoidType())
1668       return false;
1669     WarnE = this;
1670     Loc = getExprLoc();
1671     R1 = getSourceRange();
1672     return true;
1673   case ParenExprClass:
1674     return cast<ParenExpr>(this)->getSubExpr()->
1675       isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1676   case GenericSelectionExprClass:
1677     return cast<GenericSelectionExpr>(this)->getResultExpr()->
1678       isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1679   case UnaryOperatorClass: {
1680     const UnaryOperator *UO = cast<UnaryOperator>(this);
1681 
1682     switch (UO->getOpcode()) {
1683     case UO_Plus:
1684     case UO_Minus:
1685     case UO_AddrOf:
1686     case UO_Not:
1687     case UO_LNot:
1688     case UO_Deref:
1689       break;
1690     case UO_PostInc:
1691     case UO_PostDec:
1692     case UO_PreInc:
1693     case UO_PreDec:                 // ++/--
1694       return false;  // Not a warning.
1695     case UO_Real:
1696     case UO_Imag:
1697       // accessing a piece of a volatile complex is a side-effect.
1698       if (Ctx.getCanonicalType(UO->getSubExpr()->getType())
1699           .isVolatileQualified())
1700         return false;
1701       break;
1702     case UO_Extension:
1703       return UO->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1704     }
1705     WarnE = this;
1706     Loc = UO->getOperatorLoc();
1707     R1 = UO->getSubExpr()->getSourceRange();
1708     return true;
1709   }
1710   case BinaryOperatorClass: {
1711     const BinaryOperator *BO = cast<BinaryOperator>(this);
1712     switch (BO->getOpcode()) {
1713       default:
1714         break;
1715       // Consider the RHS of comma for side effects. LHS was checked by
1716       // Sema::CheckCommaOperands.
1717       case BO_Comma:
1718         // ((foo = <blah>), 0) is an idiom for hiding the result (and
1719         // lvalue-ness) of an assignment written in a macro.
1720         if (IntegerLiteral *IE =
1721               dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
1722           if (IE->getValue() == 0)
1723             return false;
1724         return BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1725       // Consider '||', '&&' to have side effects if the LHS or RHS does.
1726       case BO_LAnd:
1727       case BO_LOr:
1728         if (!BO->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx) ||
1729             !BO->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx))
1730           return false;
1731         break;
1732     }
1733     if (BO->isAssignmentOp())
1734       return false;
1735     WarnE = this;
1736     Loc = BO->getOperatorLoc();
1737     R1 = BO->getLHS()->getSourceRange();
1738     R2 = BO->getRHS()->getSourceRange();
1739     return true;
1740   }
1741   case CompoundAssignOperatorClass:
1742   case VAArgExprClass:
1743   case AtomicExprClass:
1744     return false;
1745 
1746   case ConditionalOperatorClass: {
1747     // If only one of the LHS or RHS is a warning, the operator might
1748     // be being used for control flow. Only warn if both the LHS and
1749     // RHS are warnings.
1750     const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
1751     if (!Exp->getRHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx))
1752       return false;
1753     if (!Exp->getLHS())
1754       return true;
1755     return Exp->getLHS()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1756   }
1757 
1758   case MemberExprClass:
1759     WarnE = this;
1760     Loc = cast<MemberExpr>(this)->getMemberLoc();
1761     R1 = SourceRange(Loc, Loc);
1762     R2 = cast<MemberExpr>(this)->getBase()->getSourceRange();
1763     return true;
1764 
1765   case ArraySubscriptExprClass:
1766     WarnE = this;
1767     Loc = cast<ArraySubscriptExpr>(this)->getRBracketLoc();
1768     R1 = cast<ArraySubscriptExpr>(this)->getLHS()->getSourceRange();
1769     R2 = cast<ArraySubscriptExpr>(this)->getRHS()->getSourceRange();
1770     return true;
1771 
1772   case CXXOperatorCallExprClass: {
1773     // We warn about operator== and operator!= even when user-defined operator
1774     // overloads as there is no reasonable way to define these such that they
1775     // have non-trivial, desirable side-effects. See the -Wunused-comparison
1776     // warning: these operators are commonly typo'ed, and so warning on them
1777     // provides additional value as well. If this list is updated,
1778     // DiagnoseUnusedComparison should be as well.
1779     const CXXOperatorCallExpr *Op = cast<CXXOperatorCallExpr>(this);
1780     if (Op->getOperator() == OO_EqualEqual ||
1781         Op->getOperator() == OO_ExclaimEqual) {
1782       WarnE = this;
1783       Loc = Op->getOperatorLoc();
1784       R1 = Op->getSourceRange();
1785       return true;
1786     }
1787 
1788     // Fallthrough for generic call handling.
1789   }
1790   case CallExprClass:
1791   case CXXMemberCallExprClass:
1792   case UserDefinedLiteralClass: {
1793     // If this is a direct call, get the callee.
1794     const CallExpr *CE = cast<CallExpr>(this);
1795     if (const Decl *FD = CE->getCalleeDecl()) {
1796       // If the callee has attribute pure, const, or warn_unused_result, warn
1797       // about it. void foo() { strlen("bar"); } should warn.
1798       //
1799       // Note: If new cases are added here, DiagnoseUnusedExprResult should be
1800       // updated to match for QoI.
1801       if (FD->getAttr<WarnUnusedResultAttr>() ||
1802           FD->getAttr<PureAttr>() || FD->getAttr<ConstAttr>()) {
1803         WarnE = this;
1804         Loc = CE->getCallee()->getLocStart();
1805         R1 = CE->getCallee()->getSourceRange();
1806 
1807         if (unsigned NumArgs = CE->getNumArgs())
1808           R2 = SourceRange(CE->getArg(0)->getLocStart(),
1809                            CE->getArg(NumArgs-1)->getLocEnd());
1810         return true;
1811       }
1812     }
1813     return false;
1814   }
1815 
1816   case CXXTemporaryObjectExprClass:
1817   case CXXConstructExprClass:
1818     return false;
1819 
1820   case ObjCMessageExprClass: {
1821     const ObjCMessageExpr *ME = cast<ObjCMessageExpr>(this);
1822     if (Ctx.getLangOpts().ObjCAutoRefCount &&
1823         ME->isInstanceMessage() &&
1824         !ME->getType()->isVoidType() &&
1825         ME->getSelector().getIdentifierInfoForSlot(0) &&
1826         ME->getSelector().getIdentifierInfoForSlot(0)
1827                                                ->getName().startswith("init")) {
1828       WarnE = this;
1829       Loc = getExprLoc();
1830       R1 = ME->getSourceRange();
1831       return true;
1832     }
1833 
1834     const ObjCMethodDecl *MD = ME->getMethodDecl();
1835     if (MD && MD->getAttr<WarnUnusedResultAttr>()) {
1836       WarnE = this;
1837       Loc = getExprLoc();
1838       return true;
1839     }
1840     return false;
1841   }
1842 
1843   case ObjCPropertyRefExprClass:
1844     WarnE = this;
1845     Loc = getExprLoc();
1846     R1 = getSourceRange();
1847     return true;
1848 
1849   case PseudoObjectExprClass: {
1850     const PseudoObjectExpr *PO = cast<PseudoObjectExpr>(this);
1851 
1852     // Only complain about things that have the form of a getter.
1853     if (isa<UnaryOperator>(PO->getSyntacticForm()) ||
1854         isa<BinaryOperator>(PO->getSyntacticForm()))
1855       return false;
1856 
1857     WarnE = this;
1858     Loc = getExprLoc();
1859     R1 = getSourceRange();
1860     return true;
1861   }
1862 
1863   case StmtExprClass: {
1864     // Statement exprs don't logically have side effects themselves, but are
1865     // sometimes used in macros in ways that give them a type that is unused.
1866     // For example ({ blah; foo(); }) will end up with a type if foo has a type.
1867     // however, if the result of the stmt expr is dead, we don't want to emit a
1868     // warning.
1869     const CompoundStmt *CS = cast<StmtExpr>(this)->getSubStmt();
1870     if (!CS->body_empty()) {
1871       if (const Expr *E = dyn_cast<Expr>(CS->body_back()))
1872         return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1873       if (const LabelStmt *Label = dyn_cast<LabelStmt>(CS->body_back()))
1874         if (const Expr *E = dyn_cast<Expr>(Label->getSubStmt()))
1875           return E->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1876     }
1877 
1878     if (getType()->isVoidType())
1879       return false;
1880     WarnE = this;
1881     Loc = cast<StmtExpr>(this)->getLParenLoc();
1882     R1 = getSourceRange();
1883     return true;
1884   }
1885   case CStyleCastExprClass: {
1886     // Ignore an explicit cast to void unless the operand is a non-trivial
1887     // volatile lvalue.
1888     const CastExpr *CE = cast<CastExpr>(this);
1889     if (CE->getCastKind() == CK_ToVoid) {
1890       if (CE->getSubExpr()->isGLValue() &&
1891           CE->getSubExpr()->getType().isVolatileQualified()) {
1892         const DeclRefExpr *DRE =
1893             dyn_cast<DeclRefExpr>(CE->getSubExpr()->IgnoreParens());
1894         if (!(DRE && isa<VarDecl>(DRE->getDecl()) &&
1895               cast<VarDecl>(DRE->getDecl())->hasLocalStorage())) {
1896           return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc,
1897                                                           R1, R2, Ctx);
1898         }
1899       }
1900       return false;
1901     }
1902 
1903     // If this is a cast to a constructor conversion, check the operand.
1904     // Otherwise, the result of the cast is unused.
1905     if (CE->getCastKind() == CK_ConstructorConversion)
1906       return CE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1907 
1908     WarnE = this;
1909     if (const CXXFunctionalCastExpr *CXXCE =
1910             dyn_cast<CXXFunctionalCastExpr>(this)) {
1911       Loc = CXXCE->getTypeBeginLoc();
1912       R1 = CXXCE->getSubExpr()->getSourceRange();
1913     } else {
1914       const CStyleCastExpr *CStyleCE = cast<CStyleCastExpr>(this);
1915       Loc = CStyleCE->getLParenLoc();
1916       R1 = CStyleCE->getSubExpr()->getSourceRange();
1917     }
1918     return true;
1919   }
1920   case ImplicitCastExprClass: {
1921     const CastExpr *ICE = cast<ImplicitCastExpr>(this);
1922 
1923     // lvalue-to-rvalue conversion on a volatile lvalue is a side-effect.
1924     if (ICE->getCastKind() == CK_LValueToRValue &&
1925         ICE->getSubExpr()->getType().isVolatileQualified())
1926       return false;
1927 
1928     return ICE->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx);
1929   }
1930   case CXXDefaultArgExprClass:
1931     return (cast<CXXDefaultArgExpr>(this)
1932             ->getExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx));
1933 
1934   case CXXNewExprClass:
1935     // FIXME: In theory, there might be new expressions that don't have side
1936     // effects (e.g. a placement new with an uninitialized POD).
1937   case CXXDeleteExprClass:
1938     return false;
1939   case CXXBindTemporaryExprClass:
1940     return (cast<CXXBindTemporaryExpr>(this)
1941             ->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx));
1942   case ExprWithCleanupsClass:
1943     return (cast<ExprWithCleanups>(this)
1944             ->getSubExpr()->isUnusedResultAWarning(WarnE, Loc, R1, R2, Ctx));
1945   }
1946 }
1947 
1948 /// isOBJCGCCandidate - Check if an expression is objc gc'able.
1949 /// returns true, if it is; false otherwise.
1950 bool Expr::isOBJCGCCandidate(ASTContext &Ctx) const {
1951   const Expr *E = IgnoreParens();
1952   switch (E->getStmtClass()) {
1953   default:
1954     return false;
1955   case ObjCIvarRefExprClass:
1956     return true;
1957   case Expr::UnaryOperatorClass:
1958     return cast<UnaryOperator>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1959   case ImplicitCastExprClass:
1960     return cast<ImplicitCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1961   case MaterializeTemporaryExprClass:
1962     return cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr()
1963                                                       ->isOBJCGCCandidate(Ctx);
1964   case CStyleCastExprClass:
1965     return cast<CStyleCastExpr>(E)->getSubExpr()->isOBJCGCCandidate(Ctx);
1966   case DeclRefExprClass: {
1967     const Decl *D = cast<DeclRefExpr>(E)->getDecl();
1968 
1969     if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
1970       if (VD->hasGlobalStorage())
1971         return true;
1972       QualType T = VD->getType();
1973       // dereferencing to a  pointer is always a gc'able candidate,
1974       // unless it is __weak.
1975       return T->isPointerType() &&
1976              (Ctx.getObjCGCAttrKind(T) != Qualifiers::Weak);
1977     }
1978     return false;
1979   }
1980   case MemberExprClass: {
1981     const MemberExpr *M = cast<MemberExpr>(E);
1982     return M->getBase()->isOBJCGCCandidate(Ctx);
1983   }
1984   case ArraySubscriptExprClass:
1985     return cast<ArraySubscriptExpr>(E)->getBase()->isOBJCGCCandidate(Ctx);
1986   }
1987 }
1988 
1989 bool Expr::isBoundMemberFunction(ASTContext &Ctx) const {
1990   if (isTypeDependent())
1991     return false;
1992   return ClassifyLValue(Ctx) == Expr::LV_MemberFunction;
1993 }
1994 
1995 QualType Expr::findBoundMemberType(const Expr *expr) {
1996   assert(expr->hasPlaceholderType(BuiltinType::BoundMember));
1997 
1998   // Bound member expressions are always one of these possibilities:
1999   //   x->m      x.m      x->*y      x.*y
2000   // (possibly parenthesized)
2001 
2002   expr = expr->IgnoreParens();
2003   if (const MemberExpr *mem = dyn_cast<MemberExpr>(expr)) {
2004     assert(isa<CXXMethodDecl>(mem->getMemberDecl()));
2005     return mem->getMemberDecl()->getType();
2006   }
2007 
2008   if (const BinaryOperator *op = dyn_cast<BinaryOperator>(expr)) {
2009     QualType type = op->getRHS()->getType()->castAs<MemberPointerType>()
2010                       ->getPointeeType();
2011     assert(type->isFunctionType());
2012     return type;
2013   }
2014 
2015   assert(isa<UnresolvedMemberExpr>(expr));
2016   return QualType();
2017 }
2018 
2019 Expr* Expr::IgnoreParens() {
2020   Expr* E = this;
2021   while (true) {
2022     if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
2023       E = P->getSubExpr();
2024       continue;
2025     }
2026     if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2027       if (P->getOpcode() == UO_Extension) {
2028         E = P->getSubExpr();
2029         continue;
2030       }
2031     }
2032     if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2033       if (!P->isResultDependent()) {
2034         E = P->getResultExpr();
2035         continue;
2036       }
2037     }
2038     return E;
2039   }
2040 }
2041 
2042 /// IgnoreParenCasts - Ignore parentheses and casts.  Strip off any ParenExpr
2043 /// or CastExprs or ImplicitCastExprs, returning their operand.
2044 Expr *Expr::IgnoreParenCasts() {
2045   Expr *E = this;
2046   while (true) {
2047     if (ParenExpr* P = dyn_cast<ParenExpr>(E)) {
2048       E = P->getSubExpr();
2049       continue;
2050     }
2051     if (CastExpr *P = dyn_cast<CastExpr>(E)) {
2052       E = P->getSubExpr();
2053       continue;
2054     }
2055     if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2056       if (P->getOpcode() == UO_Extension) {
2057         E = P->getSubExpr();
2058         continue;
2059       }
2060     }
2061     if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2062       if (!P->isResultDependent()) {
2063         E = P->getResultExpr();
2064         continue;
2065       }
2066     }
2067     if (MaterializeTemporaryExpr *Materialize
2068                                       = dyn_cast<MaterializeTemporaryExpr>(E)) {
2069       E = Materialize->GetTemporaryExpr();
2070       continue;
2071     }
2072     if (SubstNonTypeTemplateParmExpr *NTTP
2073                                   = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
2074       E = NTTP->getReplacement();
2075       continue;
2076     }
2077     return E;
2078   }
2079 }
2080 
2081 /// IgnoreParenLValueCasts - Ignore parentheses and lvalue-to-rvalue
2082 /// casts.  This is intended purely as a temporary workaround for code
2083 /// that hasn't yet been rewritten to do the right thing about those
2084 /// casts, and may disappear along with the last internal use.
2085 Expr *Expr::IgnoreParenLValueCasts() {
2086   Expr *E = this;
2087   while (true) {
2088     if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
2089       E = P->getSubExpr();
2090       continue;
2091     } else if (CastExpr *P = dyn_cast<CastExpr>(E)) {
2092       if (P->getCastKind() == CK_LValueToRValue) {
2093         E = P->getSubExpr();
2094         continue;
2095       }
2096     } else if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2097       if (P->getOpcode() == UO_Extension) {
2098         E = P->getSubExpr();
2099         continue;
2100       }
2101     } else if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2102       if (!P->isResultDependent()) {
2103         E = P->getResultExpr();
2104         continue;
2105       }
2106     } else if (MaterializeTemporaryExpr *Materialize
2107                                       = dyn_cast<MaterializeTemporaryExpr>(E)) {
2108       E = Materialize->GetTemporaryExpr();
2109       continue;
2110     } else if (SubstNonTypeTemplateParmExpr *NTTP
2111                                   = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
2112       E = NTTP->getReplacement();
2113       continue;
2114     }
2115     break;
2116   }
2117   return E;
2118 }
2119 
2120 Expr *Expr::IgnoreParenImpCasts() {
2121   Expr *E = this;
2122   while (true) {
2123     if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
2124       E = P->getSubExpr();
2125       continue;
2126     }
2127     if (ImplicitCastExpr *P = dyn_cast<ImplicitCastExpr>(E)) {
2128       E = P->getSubExpr();
2129       continue;
2130     }
2131     if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2132       if (P->getOpcode() == UO_Extension) {
2133         E = P->getSubExpr();
2134         continue;
2135       }
2136     }
2137     if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2138       if (!P->isResultDependent()) {
2139         E = P->getResultExpr();
2140         continue;
2141       }
2142     }
2143     if (MaterializeTemporaryExpr *Materialize
2144                                       = dyn_cast<MaterializeTemporaryExpr>(E)) {
2145       E = Materialize->GetTemporaryExpr();
2146       continue;
2147     }
2148     if (SubstNonTypeTemplateParmExpr *NTTP
2149                                   = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
2150       E = NTTP->getReplacement();
2151       continue;
2152     }
2153     return E;
2154   }
2155 }
2156 
2157 Expr *Expr::IgnoreConversionOperator() {
2158   if (CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(this)) {
2159     if (MCE->getMethodDecl() && isa<CXXConversionDecl>(MCE->getMethodDecl()))
2160       return MCE->getImplicitObjectArgument();
2161   }
2162   return this;
2163 }
2164 
2165 /// IgnoreParenNoopCasts - Ignore parentheses and casts that do not change the
2166 /// value (including ptr->int casts of the same size).  Strip off any
2167 /// ParenExpr or CastExprs, returning their operand.
2168 Expr *Expr::IgnoreParenNoopCasts(ASTContext &Ctx) {
2169   Expr *E = this;
2170   while (true) {
2171     if (ParenExpr *P = dyn_cast<ParenExpr>(E)) {
2172       E = P->getSubExpr();
2173       continue;
2174     }
2175 
2176     if (CastExpr *P = dyn_cast<CastExpr>(E)) {
2177       // We ignore integer <-> casts that are of the same width, ptr<->ptr and
2178       // ptr<->int casts of the same width.  We also ignore all identity casts.
2179       Expr *SE = P->getSubExpr();
2180 
2181       if (Ctx.hasSameUnqualifiedType(E->getType(), SE->getType())) {
2182         E = SE;
2183         continue;
2184       }
2185 
2186       if ((E->getType()->isPointerType() ||
2187            E->getType()->isIntegralType(Ctx)) &&
2188           (SE->getType()->isPointerType() ||
2189            SE->getType()->isIntegralType(Ctx)) &&
2190           Ctx.getTypeSize(E->getType()) == Ctx.getTypeSize(SE->getType())) {
2191         E = SE;
2192         continue;
2193       }
2194     }
2195 
2196     if (UnaryOperator* P = dyn_cast<UnaryOperator>(E)) {
2197       if (P->getOpcode() == UO_Extension) {
2198         E = P->getSubExpr();
2199         continue;
2200       }
2201     }
2202 
2203     if (GenericSelectionExpr* P = dyn_cast<GenericSelectionExpr>(E)) {
2204       if (!P->isResultDependent()) {
2205         E = P->getResultExpr();
2206         continue;
2207       }
2208     }
2209 
2210     if (SubstNonTypeTemplateParmExpr *NTTP
2211                                   = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
2212       E = NTTP->getReplacement();
2213       continue;
2214     }
2215 
2216     return E;
2217   }
2218 }
2219 
2220 bool Expr::isDefaultArgument() const {
2221   const Expr *E = this;
2222   if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
2223     E = M->GetTemporaryExpr();
2224 
2225   while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E))
2226     E = ICE->getSubExprAsWritten();
2227 
2228   return isa<CXXDefaultArgExpr>(E);
2229 }
2230 
2231 /// \brief Skip over any no-op casts and any temporary-binding
2232 /// expressions.
2233 static const Expr *skipTemporaryBindingsNoOpCastsAndParens(const Expr *E) {
2234   if (const MaterializeTemporaryExpr *M = dyn_cast<MaterializeTemporaryExpr>(E))
2235     E = M->GetTemporaryExpr();
2236 
2237   while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2238     if (ICE->getCastKind() == CK_NoOp)
2239       E = ICE->getSubExpr();
2240     else
2241       break;
2242   }
2243 
2244   while (const CXXBindTemporaryExpr *BE = dyn_cast<CXXBindTemporaryExpr>(E))
2245     E = BE->getSubExpr();
2246 
2247   while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2248     if (ICE->getCastKind() == CK_NoOp)
2249       E = ICE->getSubExpr();
2250     else
2251       break;
2252   }
2253 
2254   return E->IgnoreParens();
2255 }
2256 
2257 /// isTemporaryObject - Determines if this expression produces a
2258 /// temporary of the given class type.
2259 bool Expr::isTemporaryObject(ASTContext &C, const CXXRecordDecl *TempTy) const {
2260   if (!C.hasSameUnqualifiedType(getType(), C.getTypeDeclType(TempTy)))
2261     return false;
2262 
2263   const Expr *E = skipTemporaryBindingsNoOpCastsAndParens(this);
2264 
2265   // Temporaries are by definition pr-values of class type.
2266   if (!E->Classify(C).isPRValue()) {
2267     // In this context, property reference is a message call and is pr-value.
2268     if (!isa<ObjCPropertyRefExpr>(E))
2269       return false;
2270   }
2271 
2272   // Black-list a few cases which yield pr-values of class type that don't
2273   // refer to temporaries of that type:
2274 
2275   // - implicit derived-to-base conversions
2276   if (isa<ImplicitCastExpr>(E)) {
2277     switch (cast<ImplicitCastExpr>(E)->getCastKind()) {
2278     case CK_DerivedToBase:
2279     case CK_UncheckedDerivedToBase:
2280       return false;
2281     default:
2282       break;
2283     }
2284   }
2285 
2286   // - member expressions (all)
2287   if (isa<MemberExpr>(E))
2288     return false;
2289 
2290   // - opaque values (all)
2291   if (isa<OpaqueValueExpr>(E))
2292     return false;
2293 
2294   return true;
2295 }
2296 
2297 bool Expr::isImplicitCXXThis() const {
2298   const Expr *E = this;
2299 
2300   // Strip away parentheses and casts we don't care about.
2301   while (true) {
2302     if (const ParenExpr *Paren = dyn_cast<ParenExpr>(E)) {
2303       E = Paren->getSubExpr();
2304       continue;
2305     }
2306 
2307     if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2308       if (ICE->getCastKind() == CK_NoOp ||
2309           ICE->getCastKind() == CK_LValueToRValue ||
2310           ICE->getCastKind() == CK_DerivedToBase ||
2311           ICE->getCastKind() == CK_UncheckedDerivedToBase) {
2312         E = ICE->getSubExpr();
2313         continue;
2314       }
2315     }
2316 
2317     if (const UnaryOperator* UnOp = dyn_cast<UnaryOperator>(E)) {
2318       if (UnOp->getOpcode() == UO_Extension) {
2319         E = UnOp->getSubExpr();
2320         continue;
2321       }
2322     }
2323 
2324     if (const MaterializeTemporaryExpr *M
2325                                       = dyn_cast<MaterializeTemporaryExpr>(E)) {
2326       E = M->GetTemporaryExpr();
2327       continue;
2328     }
2329 
2330     break;
2331   }
2332 
2333   if (const CXXThisExpr *This = dyn_cast<CXXThisExpr>(E))
2334     return This->isImplicit();
2335 
2336   return false;
2337 }
2338 
2339 /// hasAnyTypeDependentArguments - Determines if any of the expressions
2340 /// in Exprs is type-dependent.
2341 bool Expr::hasAnyTypeDependentArguments(llvm::ArrayRef<Expr *> Exprs) {
2342   for (unsigned I = 0; I < Exprs.size(); ++I)
2343     if (Exprs[I]->isTypeDependent())
2344       return true;
2345 
2346   return false;
2347 }
2348 
2349 bool Expr::isConstantInitializer(ASTContext &Ctx, bool IsForRef) const {
2350   // This function is attempting whether an expression is an initializer
2351   // which can be evaluated at compile-time.  isEvaluatable handles most
2352   // of the cases, but it can't deal with some initializer-specific
2353   // expressions, and it can't deal with aggregates; we deal with those here,
2354   // and fall back to isEvaluatable for the other cases.
2355 
2356   // If we ever capture reference-binding directly in the AST, we can
2357   // kill the second parameter.
2358 
2359   if (IsForRef) {
2360     EvalResult Result;
2361     return EvaluateAsLValue(Result, Ctx) && !Result.HasSideEffects;
2362   }
2363 
2364   switch (getStmtClass()) {
2365   default: break;
2366   case IntegerLiteralClass:
2367   case FloatingLiteralClass:
2368   case StringLiteralClass:
2369   case ObjCStringLiteralClass:
2370   case ObjCEncodeExprClass:
2371     return true;
2372   case CXXTemporaryObjectExprClass:
2373   case CXXConstructExprClass: {
2374     const CXXConstructExpr *CE = cast<CXXConstructExpr>(this);
2375 
2376     // Only if it's
2377     if (CE->getConstructor()->isTrivial()) {
2378       // 1) an application of the trivial default constructor or
2379       if (!CE->getNumArgs()) return true;
2380 
2381       // 2) an elidable trivial copy construction of an operand which is
2382       //    itself a constant initializer.  Note that we consider the
2383       //    operand on its own, *not* as a reference binding.
2384       if (CE->isElidable() &&
2385           CE->getArg(0)->isConstantInitializer(Ctx, false))
2386         return true;
2387     }
2388 
2389     // 3) a foldable constexpr constructor.
2390     break;
2391   }
2392   case CompoundLiteralExprClass: {
2393     // This handles gcc's extension that allows global initializers like
2394     // "struct x {int x;} x = (struct x) {};".
2395     // FIXME: This accepts other cases it shouldn't!
2396     const Expr *Exp = cast<CompoundLiteralExpr>(this)->getInitializer();
2397     return Exp->isConstantInitializer(Ctx, false);
2398   }
2399   case InitListExprClass: {
2400     // FIXME: This doesn't deal with fields with reference types correctly.
2401     // FIXME: This incorrectly allows pointers cast to integers to be assigned
2402     // to bitfields.
2403     const InitListExpr *Exp = cast<InitListExpr>(this);
2404     unsigned numInits = Exp->getNumInits();
2405     for (unsigned i = 0; i < numInits; i++) {
2406       if (!Exp->getInit(i)->isConstantInitializer(Ctx, false))
2407         return false;
2408     }
2409     return true;
2410   }
2411   case ImplicitValueInitExprClass:
2412     return true;
2413   case ParenExprClass:
2414     return cast<ParenExpr>(this)->getSubExpr()
2415       ->isConstantInitializer(Ctx, IsForRef);
2416   case GenericSelectionExprClass:
2417     if (cast<GenericSelectionExpr>(this)->isResultDependent())
2418       return false;
2419     return cast<GenericSelectionExpr>(this)->getResultExpr()
2420       ->isConstantInitializer(Ctx, IsForRef);
2421   case ChooseExprClass:
2422     return cast<ChooseExpr>(this)->getChosenSubExpr(Ctx)
2423       ->isConstantInitializer(Ctx, IsForRef);
2424   case UnaryOperatorClass: {
2425     const UnaryOperator* Exp = cast<UnaryOperator>(this);
2426     if (Exp->getOpcode() == UO_Extension)
2427       return Exp->getSubExpr()->isConstantInitializer(Ctx, false);
2428     break;
2429   }
2430   case CXXFunctionalCastExprClass:
2431   case CXXStaticCastExprClass:
2432   case ImplicitCastExprClass:
2433   case CStyleCastExprClass: {
2434     const CastExpr *CE = cast<CastExpr>(this);
2435 
2436     // If we're promoting an integer to an _Atomic type then this is constant
2437     // if the integer is constant.  We also need to check the converse in case
2438     // someone does something like:
2439     //
2440     // int a = (_Atomic(int))42;
2441     //
2442     // I doubt anyone would write code like this directly, but it's quite
2443     // possible as the result of macro expansions.
2444     if (CE->getCastKind() == CK_NonAtomicToAtomic ||
2445         CE->getCastKind() == CK_AtomicToNonAtomic)
2446       return CE->getSubExpr()->isConstantInitializer(Ctx, false);
2447 
2448     // Handle bitcasts of vector constants.
2449     if (getType()->isVectorType() && CE->getCastKind() == CK_BitCast)
2450       return CE->getSubExpr()->isConstantInitializer(Ctx, false);
2451 
2452     // Handle misc casts we want to ignore.
2453     // FIXME: Is it really safe to ignore all these?
2454     if (CE->getCastKind() == CK_NoOp ||
2455         CE->getCastKind() == CK_LValueToRValue ||
2456         CE->getCastKind() == CK_ToUnion ||
2457         CE->getCastKind() == CK_ConstructorConversion)
2458       return CE->getSubExpr()->isConstantInitializer(Ctx, false);
2459 
2460     break;
2461   }
2462   case MaterializeTemporaryExprClass:
2463     return cast<MaterializeTemporaryExpr>(this)->GetTemporaryExpr()
2464                                             ->isConstantInitializer(Ctx, false);
2465   }
2466   return isEvaluatable(Ctx);
2467 }
2468 
2469 namespace {
2470   /// \brief Look for a call to a non-trivial function within an expression.
2471   class NonTrivialCallFinder : public EvaluatedExprVisitor<NonTrivialCallFinder>
2472   {
2473     typedef EvaluatedExprVisitor<NonTrivialCallFinder> Inherited;
2474 
2475     bool NonTrivial;
2476 
2477   public:
2478     explicit NonTrivialCallFinder(ASTContext &Context)
2479       : Inherited(Context), NonTrivial(false) { }
2480 
2481     bool hasNonTrivialCall() const { return NonTrivial; }
2482 
2483     void VisitCallExpr(CallExpr *E) {
2484       if (CXXMethodDecl *Method
2485           = dyn_cast_or_null<CXXMethodDecl>(E->getCalleeDecl())) {
2486         if (Method->isTrivial()) {
2487           // Recurse to children of the call.
2488           Inherited::VisitStmt(E);
2489           return;
2490         }
2491       }
2492 
2493       NonTrivial = true;
2494     }
2495 
2496     void VisitCXXConstructExpr(CXXConstructExpr *E) {
2497       if (E->getConstructor()->isTrivial()) {
2498         // Recurse to children of the call.
2499         Inherited::VisitStmt(E);
2500         return;
2501       }
2502 
2503       NonTrivial = true;
2504     }
2505 
2506     void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
2507       if (E->getTemporary()->getDestructor()->isTrivial()) {
2508         Inherited::VisitStmt(E);
2509         return;
2510       }
2511 
2512       NonTrivial = true;
2513     }
2514   };
2515 }
2516 
2517 bool Expr::hasNonTrivialCall(ASTContext &Ctx) {
2518   NonTrivialCallFinder Finder(Ctx);
2519   Finder.Visit(this);
2520   return Finder.hasNonTrivialCall();
2521 }
2522 
2523 /// isNullPointerConstant - C99 6.3.2.3p3 - Return whether this is a null
2524 /// pointer constant or not, as well as the specific kind of constant detected.
2525 /// Null pointer constants can be integer constant expressions with the
2526 /// value zero, casts of zero to void*, nullptr (C++0X), or __null
2527 /// (a GNU extension).
2528 Expr::NullPointerConstantKind
2529 Expr::isNullPointerConstant(ASTContext &Ctx,
2530                             NullPointerConstantValueDependence NPC) const {
2531   if (isValueDependent()) {
2532     switch (NPC) {
2533     case NPC_NeverValueDependent:
2534       llvm_unreachable("Unexpected value dependent expression!");
2535     case NPC_ValueDependentIsNull:
2536       if (isTypeDependent() || getType()->isIntegralType(Ctx))
2537         return NPCK_ZeroInteger;
2538       else
2539         return NPCK_NotNull;
2540 
2541     case NPC_ValueDependentIsNotNull:
2542       return NPCK_NotNull;
2543     }
2544   }
2545 
2546   // Strip off a cast to void*, if it exists. Except in C++.
2547   if (const ExplicitCastExpr *CE = dyn_cast<ExplicitCastExpr>(this)) {
2548     if (!Ctx.getLangOpts().CPlusPlus) {
2549       // Check that it is a cast to void*.
2550       if (const PointerType *PT = CE->getType()->getAs<PointerType>()) {
2551         QualType Pointee = PT->getPointeeType();
2552         if (!Pointee.hasQualifiers() &&
2553             Pointee->isVoidType() &&                              // to void*
2554             CE->getSubExpr()->getType()->isIntegerType())         // from int.
2555           return CE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2556       }
2557     }
2558   } else if (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(this)) {
2559     // Ignore the ImplicitCastExpr type entirely.
2560     return ICE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2561   } else if (const ParenExpr *PE = dyn_cast<ParenExpr>(this)) {
2562     // Accept ((void*)0) as a null pointer constant, as many other
2563     // implementations do.
2564     return PE->getSubExpr()->isNullPointerConstant(Ctx, NPC);
2565   } else if (const GenericSelectionExpr *GE =
2566                dyn_cast<GenericSelectionExpr>(this)) {
2567     return GE->getResultExpr()->isNullPointerConstant(Ctx, NPC);
2568   } else if (const CXXDefaultArgExpr *DefaultArg
2569                = dyn_cast<CXXDefaultArgExpr>(this)) {
2570     // See through default argument expressions
2571     return DefaultArg->getExpr()->isNullPointerConstant(Ctx, NPC);
2572   } else if (isa<GNUNullExpr>(this)) {
2573     // The GNU __null extension is always a null pointer constant.
2574     return NPCK_GNUNull;
2575   } else if (const MaterializeTemporaryExpr *M
2576                                    = dyn_cast<MaterializeTemporaryExpr>(this)) {
2577     return M->GetTemporaryExpr()->isNullPointerConstant(Ctx, NPC);
2578   } else if (const OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(this)) {
2579     if (const Expr *Source = OVE->getSourceExpr())
2580       return Source->isNullPointerConstant(Ctx, NPC);
2581   }
2582 
2583   // C++0x nullptr_t is always a null pointer constant.
2584   if (getType()->isNullPtrType())
2585     return NPCK_CXX0X_nullptr;
2586 
2587   if (const RecordType *UT = getType()->getAsUnionType())
2588     if (UT && UT->getDecl()->hasAttr<TransparentUnionAttr>())
2589       if (const CompoundLiteralExpr *CLE = dyn_cast<CompoundLiteralExpr>(this)){
2590         const Expr *InitExpr = CLE->getInitializer();
2591         if (const InitListExpr *ILE = dyn_cast<InitListExpr>(InitExpr))
2592           return ILE->getInit(0)->isNullPointerConstant(Ctx, NPC);
2593       }
2594   // This expression must be an integer type.
2595   if (!getType()->isIntegerType() ||
2596       (Ctx.getLangOpts().CPlusPlus && getType()->isEnumeralType()))
2597     return NPCK_NotNull;
2598 
2599   // If we have an integer constant expression, we need to *evaluate* it and
2600   // test for the value 0. Don't use the C++11 constant expression semantics
2601   // for this, for now; once the dust settles on core issue 903, we might only
2602   // allow a literal 0 here in C++11 mode.
2603   if (Ctx.getLangOpts().CPlusPlus0x) {
2604     if (!isCXX98IntegralConstantExpr(Ctx))
2605       return NPCK_NotNull;
2606   } else {
2607     if (!isIntegerConstantExpr(Ctx))
2608       return NPCK_NotNull;
2609   }
2610 
2611   return (EvaluateKnownConstInt(Ctx) == 0) ? NPCK_ZeroInteger : NPCK_NotNull;
2612 }
2613 
2614 /// \brief If this expression is an l-value for an Objective C
2615 /// property, find the underlying property reference expression.
2616 const ObjCPropertyRefExpr *Expr::getObjCProperty() const {
2617   const Expr *E = this;
2618   while (true) {
2619     assert((E->getValueKind() == VK_LValue &&
2620             E->getObjectKind() == OK_ObjCProperty) &&
2621            "expression is not a property reference");
2622     E = E->IgnoreParenCasts();
2623     if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
2624       if (BO->getOpcode() == BO_Comma) {
2625         E = BO->getRHS();
2626         continue;
2627       }
2628     }
2629 
2630     break;
2631   }
2632 
2633   return cast<ObjCPropertyRefExpr>(E);
2634 }
2635 
2636 FieldDecl *Expr::getBitField() {
2637   Expr *E = this->IgnoreParens();
2638 
2639   while (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2640     if (ICE->getCastKind() == CK_LValueToRValue ||
2641         (ICE->getValueKind() != VK_RValue && ICE->getCastKind() == CK_NoOp))
2642       E = ICE->getSubExpr()->IgnoreParens();
2643     else
2644       break;
2645   }
2646 
2647   if (MemberExpr *MemRef = dyn_cast<MemberExpr>(E))
2648     if (FieldDecl *Field = dyn_cast<FieldDecl>(MemRef->getMemberDecl()))
2649       if (Field->isBitField())
2650         return Field;
2651 
2652   if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(E))
2653     if (FieldDecl *Field = dyn_cast<FieldDecl>(DeclRef->getDecl()))
2654       if (Field->isBitField())
2655         return Field;
2656 
2657   if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(E)) {
2658     if (BinOp->isAssignmentOp() && BinOp->getLHS())
2659       return BinOp->getLHS()->getBitField();
2660 
2661     if (BinOp->getOpcode() == BO_Comma && BinOp->getRHS())
2662       return BinOp->getRHS()->getBitField();
2663   }
2664 
2665   return 0;
2666 }
2667 
2668 bool Expr::refersToVectorElement() const {
2669   const Expr *E = this->IgnoreParens();
2670 
2671   while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(E)) {
2672     if (ICE->getValueKind() != VK_RValue &&
2673         ICE->getCastKind() == CK_NoOp)
2674       E = ICE->getSubExpr()->IgnoreParens();
2675     else
2676       break;
2677   }
2678 
2679   if (const ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E))
2680     return ASE->getBase()->getType()->isVectorType();
2681 
2682   if (isa<ExtVectorElementExpr>(E))
2683     return true;
2684 
2685   return false;
2686 }
2687 
2688 /// isArrow - Return true if the base expression is a pointer to vector,
2689 /// return false if the base expression is a vector.
2690 bool ExtVectorElementExpr::isArrow() const {
2691   return getBase()->getType()->isPointerType();
2692 }
2693 
2694 unsigned ExtVectorElementExpr::getNumElements() const {
2695   if (const VectorType *VT = getType()->getAs<VectorType>())
2696     return VT->getNumElements();
2697   return 1;
2698 }
2699 
2700 /// containsDuplicateElements - Return true if any element access is repeated.
2701 bool ExtVectorElementExpr::containsDuplicateElements() const {
2702   // FIXME: Refactor this code to an accessor on the AST node which returns the
2703   // "type" of component access, and share with code below and in Sema.
2704   StringRef Comp = Accessor->getName();
2705 
2706   // Halving swizzles do not contain duplicate elements.
2707   if (Comp == "hi" || Comp == "lo" || Comp == "even" || Comp == "odd")
2708     return false;
2709 
2710   // Advance past s-char prefix on hex swizzles.
2711   if (Comp[0] == 's' || Comp[0] == 'S')
2712     Comp = Comp.substr(1);
2713 
2714   for (unsigned i = 0, e = Comp.size(); i != e; ++i)
2715     if (Comp.substr(i + 1).find(Comp[i]) != StringRef::npos)
2716         return true;
2717 
2718   return false;
2719 }
2720 
2721 /// getEncodedElementAccess - We encode the fields as a llvm ConstantArray.
2722 void ExtVectorElementExpr::getEncodedElementAccess(
2723                                   SmallVectorImpl<unsigned> &Elts) const {
2724   StringRef Comp = Accessor->getName();
2725   if (Comp[0] == 's' || Comp[0] == 'S')
2726     Comp = Comp.substr(1);
2727 
2728   bool isHi =   Comp == "hi";
2729   bool isLo =   Comp == "lo";
2730   bool isEven = Comp == "even";
2731   bool isOdd  = Comp == "odd";
2732 
2733   for (unsigned i = 0, e = getNumElements(); i != e; ++i) {
2734     uint64_t Index;
2735 
2736     if (isHi)
2737       Index = e + i;
2738     else if (isLo)
2739       Index = i;
2740     else if (isEven)
2741       Index = 2 * i;
2742     else if (isOdd)
2743       Index = 2 * i + 1;
2744     else
2745       Index = ExtVectorType::getAccessorIdx(Comp[i]);
2746 
2747     Elts.push_back(Index);
2748   }
2749 }
2750 
2751 ObjCMessageExpr::ObjCMessageExpr(QualType T,
2752                                  ExprValueKind VK,
2753                                  SourceLocation LBracLoc,
2754                                  SourceLocation SuperLoc,
2755                                  bool IsInstanceSuper,
2756                                  QualType SuperType,
2757                                  Selector Sel,
2758                                  ArrayRef<SourceLocation> SelLocs,
2759                                  SelectorLocationsKind SelLocsK,
2760                                  ObjCMethodDecl *Method,
2761                                  ArrayRef<Expr *> Args,
2762                                  SourceLocation RBracLoc,
2763                                  bool isImplicit)
2764   : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary,
2765          /*TypeDependent=*/false, /*ValueDependent=*/false,
2766          /*InstantiationDependent=*/false,
2767          /*ContainsUnexpandedParameterPack=*/false),
2768     SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2769                                                        : Sel.getAsOpaquePtr())),
2770     Kind(IsInstanceSuper? SuperInstance : SuperClass),
2771     HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
2772     SuperLoc(SuperLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2773 {
2774   initArgsAndSelLocs(Args, SelLocs, SelLocsK);
2775   setReceiverPointer(SuperType.getAsOpaquePtr());
2776 }
2777 
2778 ObjCMessageExpr::ObjCMessageExpr(QualType T,
2779                                  ExprValueKind VK,
2780                                  SourceLocation LBracLoc,
2781                                  TypeSourceInfo *Receiver,
2782                                  Selector Sel,
2783                                  ArrayRef<SourceLocation> SelLocs,
2784                                  SelectorLocationsKind SelLocsK,
2785                                  ObjCMethodDecl *Method,
2786                                  ArrayRef<Expr *> Args,
2787                                  SourceLocation RBracLoc,
2788                                  bool isImplicit)
2789   : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(),
2790          T->isDependentType(), T->isInstantiationDependentType(),
2791          T->containsUnexpandedParameterPack()),
2792     SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2793                                                        : Sel.getAsOpaquePtr())),
2794     Kind(Class),
2795     HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
2796     LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2797 {
2798   initArgsAndSelLocs(Args, SelLocs, SelLocsK);
2799   setReceiverPointer(Receiver);
2800 }
2801 
2802 ObjCMessageExpr::ObjCMessageExpr(QualType T,
2803                                  ExprValueKind VK,
2804                                  SourceLocation LBracLoc,
2805                                  Expr *Receiver,
2806                                  Selector Sel,
2807                                  ArrayRef<SourceLocation> SelLocs,
2808                                  SelectorLocationsKind SelLocsK,
2809                                  ObjCMethodDecl *Method,
2810                                  ArrayRef<Expr *> Args,
2811                                  SourceLocation RBracLoc,
2812                                  bool isImplicit)
2813   : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(),
2814          Receiver->isTypeDependent(),
2815          Receiver->isInstantiationDependent(),
2816          Receiver->containsUnexpandedParameterPack()),
2817     SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
2818                                                        : Sel.getAsOpaquePtr())),
2819     Kind(Instance),
2820     HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit),
2821     LBracLoc(LBracLoc), RBracLoc(RBracLoc)
2822 {
2823   initArgsAndSelLocs(Args, SelLocs, SelLocsK);
2824   setReceiverPointer(Receiver);
2825 }
2826 
2827 void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args,
2828                                          ArrayRef<SourceLocation> SelLocs,
2829                                          SelectorLocationsKind SelLocsK) {
2830   setNumArgs(Args.size());
2831   Expr **MyArgs = getArgs();
2832   for (unsigned I = 0; I != Args.size(); ++I) {
2833     if (Args[I]->isTypeDependent())
2834       ExprBits.TypeDependent = true;
2835     if (Args[I]->isValueDependent())
2836       ExprBits.ValueDependent = true;
2837     if (Args[I]->isInstantiationDependent())
2838       ExprBits.InstantiationDependent = true;
2839     if (Args[I]->containsUnexpandedParameterPack())
2840       ExprBits.ContainsUnexpandedParameterPack = true;
2841 
2842     MyArgs[I] = Args[I];
2843   }
2844 
2845   SelLocsKind = SelLocsK;
2846   if (!isImplicit()) {
2847     if (SelLocsK == SelLoc_NonStandard)
2848       std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
2849   }
2850 }
2851 
2852 ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2853                                          ExprValueKind VK,
2854                                          SourceLocation LBracLoc,
2855                                          SourceLocation SuperLoc,
2856                                          bool IsInstanceSuper,
2857                                          QualType SuperType,
2858                                          Selector Sel,
2859                                          ArrayRef<SourceLocation> SelLocs,
2860                                          ObjCMethodDecl *Method,
2861                                          ArrayRef<Expr *> Args,
2862                                          SourceLocation RBracLoc,
2863                                          bool isImplicit) {
2864   assert((!SelLocs.empty() || isImplicit) &&
2865          "No selector locs for non-implicit message");
2866   ObjCMessageExpr *Mem;
2867   SelectorLocationsKind SelLocsK = SelectorLocationsKind();
2868   if (isImplicit)
2869     Mem = alloc(Context, Args.size(), 0);
2870   else
2871     Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
2872   return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
2873                                    SuperType, Sel, SelLocs, SelLocsK,
2874                                    Method, Args, RBracLoc, isImplicit);
2875 }
2876 
2877 ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2878                                          ExprValueKind VK,
2879                                          SourceLocation LBracLoc,
2880                                          TypeSourceInfo *Receiver,
2881                                          Selector Sel,
2882                                          ArrayRef<SourceLocation> SelLocs,
2883                                          ObjCMethodDecl *Method,
2884                                          ArrayRef<Expr *> Args,
2885                                          SourceLocation RBracLoc,
2886                                          bool isImplicit) {
2887   assert((!SelLocs.empty() || isImplicit) &&
2888          "No selector locs for non-implicit message");
2889   ObjCMessageExpr *Mem;
2890   SelectorLocationsKind SelLocsK = SelectorLocationsKind();
2891   if (isImplicit)
2892     Mem = alloc(Context, Args.size(), 0);
2893   else
2894     Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
2895   return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
2896                                    SelLocs, SelLocsK, Method, Args, RBracLoc,
2897                                    isImplicit);
2898 }
2899 
2900 ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
2901                                          ExprValueKind VK,
2902                                          SourceLocation LBracLoc,
2903                                          Expr *Receiver,
2904                                          Selector Sel,
2905                                          ArrayRef<SourceLocation> SelLocs,
2906                                          ObjCMethodDecl *Method,
2907                                          ArrayRef<Expr *> Args,
2908                                          SourceLocation RBracLoc,
2909                                          bool isImplicit) {
2910   assert((!SelLocs.empty() || isImplicit) &&
2911          "No selector locs for non-implicit message");
2912   ObjCMessageExpr *Mem;
2913   SelectorLocationsKind SelLocsK = SelectorLocationsKind();
2914   if (isImplicit)
2915     Mem = alloc(Context, Args.size(), 0);
2916   else
2917     Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
2918   return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
2919                                    SelLocs, SelLocsK, Method, Args, RBracLoc,
2920                                    isImplicit);
2921 }
2922 
2923 ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
2924                                               unsigned NumArgs,
2925                                               unsigned NumStoredSelLocs) {
2926   ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs);
2927   return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
2928 }
2929 
2930 ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C,
2931                                         ArrayRef<Expr *> Args,
2932                                         SourceLocation RBraceLoc,
2933                                         ArrayRef<SourceLocation> SelLocs,
2934                                         Selector Sel,
2935                                         SelectorLocationsKind &SelLocsK) {
2936   SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc);
2937   unsigned NumStoredSelLocs = (SelLocsK == SelLoc_NonStandard) ? SelLocs.size()
2938                                                                : 0;
2939   return alloc(C, Args.size(), NumStoredSelLocs);
2940 }
2941 
2942 ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C,
2943                                         unsigned NumArgs,
2944                                         unsigned NumStoredSelLocs) {
2945   unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
2946     NumArgs * sizeof(Expr *) + NumStoredSelLocs * sizeof(SourceLocation);
2947   return (ObjCMessageExpr *)C.Allocate(Size,
2948                                      llvm::AlignOf<ObjCMessageExpr>::Alignment);
2949 }
2950 
2951 void ObjCMessageExpr::getSelectorLocs(
2952                                SmallVectorImpl<SourceLocation> &SelLocs) const {
2953   for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i)
2954     SelLocs.push_back(getSelectorLoc(i));
2955 }
2956 
2957 SourceRange ObjCMessageExpr::getReceiverRange() const {
2958   switch (getReceiverKind()) {
2959   case Instance:
2960     return getInstanceReceiver()->getSourceRange();
2961 
2962   case Class:
2963     return getClassReceiverTypeInfo()->getTypeLoc().getSourceRange();
2964 
2965   case SuperInstance:
2966   case SuperClass:
2967     return getSuperLoc();
2968   }
2969 
2970   llvm_unreachable("Invalid ReceiverKind!");
2971 }
2972 
2973 Selector ObjCMessageExpr::getSelector() const {
2974   if (HasMethod)
2975     return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod)
2976                                                                ->getSelector();
2977   return Selector(SelectorOrMethod);
2978 }
2979 
2980 ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
2981   switch (getReceiverKind()) {
2982   case Instance:
2983     if (const ObjCObjectPointerType *Ptr
2984           = getInstanceReceiver()->getType()->getAs<ObjCObjectPointerType>())
2985       return Ptr->getInterfaceDecl();
2986     break;
2987 
2988   case Class:
2989     if (const ObjCObjectType *Ty
2990           = getClassReceiver()->getAs<ObjCObjectType>())
2991       return Ty->getInterface();
2992     break;
2993 
2994   case SuperInstance:
2995     if (const ObjCObjectPointerType *Ptr
2996           = getSuperType()->getAs<ObjCObjectPointerType>())
2997       return Ptr->getInterfaceDecl();
2998     break;
2999 
3000   case SuperClass:
3001     if (const ObjCObjectType *Iface
3002           = getSuperType()->getAs<ObjCObjectType>())
3003       return Iface->getInterface();
3004     break;
3005   }
3006 
3007   return 0;
3008 }
3009 
3010 StringRef ObjCBridgedCastExpr::getBridgeKindName() const {
3011   switch (getBridgeKind()) {
3012   case OBC_Bridge:
3013     return "__bridge";
3014   case OBC_BridgeTransfer:
3015     return "__bridge_transfer";
3016   case OBC_BridgeRetained:
3017     return "__bridge_retained";
3018   }
3019 
3020   llvm_unreachable("Invalid BridgeKind!");
3021 }
3022 
3023 bool ChooseExpr::isConditionTrue(const ASTContext &C) const {
3024   return getCond()->EvaluateKnownConstInt(C) != 0;
3025 }
3026 
3027 ShuffleVectorExpr::ShuffleVectorExpr(ASTContext &C, Expr **args, unsigned nexpr,
3028                                      QualType Type, SourceLocation BLoc,
3029                                      SourceLocation RP)
3030    : Expr(ShuffleVectorExprClass, Type, VK_RValue, OK_Ordinary,
3031           Type->isDependentType(), Type->isDependentType(),
3032           Type->isInstantiationDependentType(),
3033           Type->containsUnexpandedParameterPack()),
3034      BuiltinLoc(BLoc), RParenLoc(RP), NumExprs(nexpr)
3035 {
3036   SubExprs = new (C) Stmt*[nexpr];
3037   for (unsigned i = 0; i < nexpr; i++) {
3038     if (args[i]->isTypeDependent())
3039       ExprBits.TypeDependent = true;
3040     if (args[i]->isValueDependent())
3041       ExprBits.ValueDependent = true;
3042     if (args[i]->isInstantiationDependent())
3043       ExprBits.InstantiationDependent = true;
3044     if (args[i]->containsUnexpandedParameterPack())
3045       ExprBits.ContainsUnexpandedParameterPack = true;
3046 
3047     SubExprs[i] = args[i];
3048   }
3049 }
3050 
3051 void ShuffleVectorExpr::setExprs(ASTContext &C, Expr ** Exprs,
3052                                  unsigned NumExprs) {
3053   if (SubExprs) C.Deallocate(SubExprs);
3054 
3055   SubExprs = new (C) Stmt* [NumExprs];
3056   this->NumExprs = NumExprs;
3057   memcpy(SubExprs, Exprs, sizeof(Expr *) * NumExprs);
3058 }
3059 
3060 GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
3061                                SourceLocation GenericLoc, Expr *ControllingExpr,
3062                                TypeSourceInfo **AssocTypes, Expr **AssocExprs,
3063                                unsigned NumAssocs, SourceLocation DefaultLoc,
3064                                SourceLocation RParenLoc,
3065                                bool ContainsUnexpandedParameterPack,
3066                                unsigned ResultIndex)
3067   : Expr(GenericSelectionExprClass,
3068          AssocExprs[ResultIndex]->getType(),
3069          AssocExprs[ResultIndex]->getValueKind(),
3070          AssocExprs[ResultIndex]->getObjectKind(),
3071          AssocExprs[ResultIndex]->isTypeDependent(),
3072          AssocExprs[ResultIndex]->isValueDependent(),
3073          AssocExprs[ResultIndex]->isInstantiationDependent(),
3074          ContainsUnexpandedParameterPack),
3075     AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
3076     SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
3077     ResultIndex(ResultIndex), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
3078     RParenLoc(RParenLoc) {
3079   SubExprs[CONTROLLING] = ControllingExpr;
3080   std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
3081   std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
3082 }
3083 
3084 GenericSelectionExpr::GenericSelectionExpr(ASTContext &Context,
3085                                SourceLocation GenericLoc, Expr *ControllingExpr,
3086                                TypeSourceInfo **AssocTypes, Expr **AssocExprs,
3087                                unsigned NumAssocs, SourceLocation DefaultLoc,
3088                                SourceLocation RParenLoc,
3089                                bool ContainsUnexpandedParameterPack)
3090   : Expr(GenericSelectionExprClass,
3091          Context.DependentTy,
3092          VK_RValue,
3093          OK_Ordinary,
3094          /*isTypeDependent=*/true,
3095          /*isValueDependent=*/true,
3096          /*isInstantiationDependent=*/true,
3097          ContainsUnexpandedParameterPack),
3098     AssocTypes(new (Context) TypeSourceInfo*[NumAssocs]),
3099     SubExprs(new (Context) Stmt*[END_EXPR+NumAssocs]), NumAssocs(NumAssocs),
3100     ResultIndex(-1U), GenericLoc(GenericLoc), DefaultLoc(DefaultLoc),
3101     RParenLoc(RParenLoc) {
3102   SubExprs[CONTROLLING] = ControllingExpr;
3103   std::copy(AssocTypes, AssocTypes+NumAssocs, this->AssocTypes);
3104   std::copy(AssocExprs, AssocExprs+NumAssocs, SubExprs+END_EXPR);
3105 }
3106 
3107 //===----------------------------------------------------------------------===//
3108 //  DesignatedInitExpr
3109 //===----------------------------------------------------------------------===//
3110 
3111 IdentifierInfo *DesignatedInitExpr::Designator::getFieldName() const {
3112   assert(Kind == FieldDesignator && "Only valid on a field designator");
3113   if (Field.NameOrField & 0x01)
3114     return reinterpret_cast<IdentifierInfo *>(Field.NameOrField&~0x01);
3115   else
3116     return getField()->getIdentifier();
3117 }
3118 
3119 DesignatedInitExpr::DesignatedInitExpr(ASTContext &C, QualType Ty,
3120                                        unsigned NumDesignators,
3121                                        const Designator *Designators,
3122                                        SourceLocation EqualOrColonLoc,
3123                                        bool GNUSyntax,
3124                                        Expr **IndexExprs,
3125                                        unsigned NumIndexExprs,
3126                                        Expr *Init)
3127   : Expr(DesignatedInitExprClass, Ty,
3128          Init->getValueKind(), Init->getObjectKind(),
3129          Init->isTypeDependent(), Init->isValueDependent(),
3130          Init->isInstantiationDependent(),
3131          Init->containsUnexpandedParameterPack()),
3132     EqualOrColonLoc(EqualOrColonLoc), GNUSyntax(GNUSyntax),
3133     NumDesignators(NumDesignators), NumSubExprs(NumIndexExprs + 1) {
3134   this->Designators = new (C) Designator[NumDesignators];
3135 
3136   // Record the initializer itself.
3137   child_range Child = children();
3138   *Child++ = Init;
3139 
3140   // Copy the designators and their subexpressions, computing
3141   // value-dependence along the way.
3142   unsigned IndexIdx = 0;
3143   for (unsigned I = 0; I != NumDesignators; ++I) {
3144     this->Designators[I] = Designators[I];
3145 
3146     if (this->Designators[I].isArrayDesignator()) {
3147       // Compute type- and value-dependence.
3148       Expr *Index = IndexExprs[IndexIdx];
3149       if (Index->isTypeDependent() || Index->isValueDependent())
3150         ExprBits.ValueDependent = true;
3151       if (Index->isInstantiationDependent())
3152         ExprBits.InstantiationDependent = true;
3153       // Propagate unexpanded parameter packs.
3154       if (Index->containsUnexpandedParameterPack())
3155         ExprBits.ContainsUnexpandedParameterPack = true;
3156 
3157       // Copy the index expressions into permanent storage.
3158       *Child++ = IndexExprs[IndexIdx++];
3159     } else if (this->Designators[I].isArrayRangeDesignator()) {
3160       // Compute type- and value-dependence.
3161       Expr *Start = IndexExprs[IndexIdx];
3162       Expr *End = IndexExprs[IndexIdx + 1];
3163       if (Start->isTypeDependent() || Start->isValueDependent() ||
3164           End->isTypeDependent() || End->isValueDependent()) {
3165         ExprBits.ValueDependent = true;
3166         ExprBits.InstantiationDependent = true;
3167       } else if (Start->isInstantiationDependent() ||
3168                  End->isInstantiationDependent()) {
3169         ExprBits.InstantiationDependent = true;
3170       }
3171 
3172       // Propagate unexpanded parameter packs.
3173       if (Start->containsUnexpandedParameterPack() ||
3174           End->containsUnexpandedParameterPack())
3175         ExprBits.ContainsUnexpandedParameterPack = true;
3176 
3177       // Copy the start/end expressions into permanent storage.
3178       *Child++ = IndexExprs[IndexIdx++];
3179       *Child++ = IndexExprs[IndexIdx++];
3180     }
3181   }
3182 
3183   assert(IndexIdx == NumIndexExprs && "Wrong number of index expressions");
3184 }
3185 
3186 DesignatedInitExpr *
3187 DesignatedInitExpr::Create(ASTContext &C, Designator *Designators,
3188                            unsigned NumDesignators,
3189                            Expr **IndexExprs, unsigned NumIndexExprs,
3190                            SourceLocation ColonOrEqualLoc,
3191                            bool UsesColonSyntax, Expr *Init) {
3192   void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
3193                          sizeof(Stmt *) * (NumIndexExprs + 1), 8);
3194   return new (Mem) DesignatedInitExpr(C, C.VoidTy, NumDesignators, Designators,
3195                                       ColonOrEqualLoc, UsesColonSyntax,
3196                                       IndexExprs, NumIndexExprs, Init);
3197 }
3198 
3199 DesignatedInitExpr *DesignatedInitExpr::CreateEmpty(ASTContext &C,
3200                                                     unsigned NumIndexExprs) {
3201   void *Mem = C.Allocate(sizeof(DesignatedInitExpr) +
3202                          sizeof(Stmt *) * (NumIndexExprs + 1), 8);
3203   return new (Mem) DesignatedInitExpr(NumIndexExprs + 1);
3204 }
3205 
3206 void DesignatedInitExpr::setDesignators(ASTContext &C,
3207                                         const Designator *Desigs,
3208                                         unsigned NumDesigs) {
3209   Designators = new (C) Designator[NumDesigs];
3210   NumDesignators = NumDesigs;
3211   for (unsigned I = 0; I != NumDesigs; ++I)
3212     Designators[I] = Desigs[I];
3213 }
3214 
3215 SourceRange DesignatedInitExpr::getDesignatorsSourceRange() const {
3216   DesignatedInitExpr *DIE = const_cast<DesignatedInitExpr*>(this);
3217   if (size() == 1)
3218     return DIE->getDesignator(0)->getSourceRange();
3219   return SourceRange(DIE->getDesignator(0)->getStartLocation(),
3220                      DIE->getDesignator(size()-1)->getEndLocation());
3221 }
3222 
3223 SourceRange DesignatedInitExpr::getSourceRange() const {
3224   SourceLocation StartLoc;
3225   Designator &First =
3226     *const_cast<DesignatedInitExpr*>(this)->designators_begin();
3227   if (First.isFieldDesignator()) {
3228     if (GNUSyntax)
3229       StartLoc = SourceLocation::getFromRawEncoding(First.Field.FieldLoc);
3230     else
3231       StartLoc = SourceLocation::getFromRawEncoding(First.Field.DotLoc);
3232   } else
3233     StartLoc =
3234       SourceLocation::getFromRawEncoding(First.ArrayOrRange.LBracketLoc);
3235   return SourceRange(StartLoc, getInit()->getSourceRange().getEnd());
3236 }
3237 
3238 Expr *DesignatedInitExpr::getArrayIndex(const Designator& D) {
3239   assert(D.Kind == Designator::ArrayDesignator && "Requires array designator");
3240   char* Ptr = static_cast<char*>(static_cast<void *>(this));
3241   Ptr += sizeof(DesignatedInitExpr);
3242   Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
3243   return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
3244 }
3245 
3246 Expr *DesignatedInitExpr::getArrayRangeStart(const Designator& D) {
3247   assert(D.Kind == Designator::ArrayRangeDesignator &&
3248          "Requires array range designator");
3249   char* Ptr = static_cast<char*>(static_cast<void *>(this));
3250   Ptr += sizeof(DesignatedInitExpr);
3251   Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
3252   return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 1));
3253 }
3254 
3255 Expr *DesignatedInitExpr::getArrayRangeEnd(const Designator& D) {
3256   assert(D.Kind == Designator::ArrayRangeDesignator &&
3257          "Requires array range designator");
3258   char* Ptr = static_cast<char*>(static_cast<void *>(this));
3259   Ptr += sizeof(DesignatedInitExpr);
3260   Stmt **SubExprs = reinterpret_cast<Stmt**>(reinterpret_cast<void**>(Ptr));
3261   return cast<Expr>(*(SubExprs + D.ArrayOrRange.Index + 2));
3262 }
3263 
3264 /// \brief Replaces the designator at index @p Idx with the series
3265 /// of designators in [First, Last).
3266 void DesignatedInitExpr::ExpandDesignator(ASTContext &C, unsigned Idx,
3267                                           const Designator *First,
3268                                           const Designator *Last) {
3269   unsigned NumNewDesignators = Last - First;
3270   if (NumNewDesignators == 0) {
3271     std::copy_backward(Designators + Idx + 1,
3272                        Designators + NumDesignators,
3273                        Designators + Idx);
3274     --NumNewDesignators;
3275     return;
3276   } else if (NumNewDesignators == 1) {
3277     Designators[Idx] = *First;
3278     return;
3279   }
3280 
3281   Designator *NewDesignators
3282     = new (C) Designator[NumDesignators - 1 + NumNewDesignators];
3283   std::copy(Designators, Designators + Idx, NewDesignators);
3284   std::copy(First, Last, NewDesignators + Idx);
3285   std::copy(Designators + Idx + 1, Designators + NumDesignators,
3286             NewDesignators + Idx + NumNewDesignators);
3287   Designators = NewDesignators;
3288   NumDesignators = NumDesignators - 1 + NumNewDesignators;
3289 }
3290 
3291 ParenListExpr::ParenListExpr(ASTContext& C, SourceLocation lparenloc,
3292                              Expr **exprs, unsigned nexprs,
3293                              SourceLocation rparenloc)
3294   : Expr(ParenListExprClass, QualType(), VK_RValue, OK_Ordinary,
3295          false, false, false, false),
3296     NumExprs(nexprs), LParenLoc(lparenloc), RParenLoc(rparenloc) {
3297   Exprs = new (C) Stmt*[nexprs];
3298   for (unsigned i = 0; i != nexprs; ++i) {
3299     if (exprs[i]->isTypeDependent())
3300       ExprBits.TypeDependent = true;
3301     if (exprs[i]->isValueDependent())
3302       ExprBits.ValueDependent = true;
3303     if (exprs[i]->isInstantiationDependent())
3304       ExprBits.InstantiationDependent = true;
3305     if (exprs[i]->containsUnexpandedParameterPack())
3306       ExprBits.ContainsUnexpandedParameterPack = true;
3307 
3308     Exprs[i] = exprs[i];
3309   }
3310 }
3311 
3312 const OpaqueValueExpr *OpaqueValueExpr::findInCopyConstruct(const Expr *e) {
3313   if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(e))
3314     e = ewc->getSubExpr();
3315   if (const MaterializeTemporaryExpr *m = dyn_cast<MaterializeTemporaryExpr>(e))
3316     e = m->GetTemporaryExpr();
3317   e = cast<CXXConstructExpr>(e)->getArg(0);
3318   while (const ImplicitCastExpr *ice = dyn_cast<ImplicitCastExpr>(e))
3319     e = ice->getSubExpr();
3320   return cast<OpaqueValueExpr>(e);
3321 }
3322 
3323 PseudoObjectExpr *PseudoObjectExpr::Create(ASTContext &Context, EmptyShell sh,
3324                                            unsigned numSemanticExprs) {
3325   void *buffer = Context.Allocate(sizeof(PseudoObjectExpr) +
3326                                     (1 + numSemanticExprs) * sizeof(Expr*),
3327                                   llvm::alignOf<PseudoObjectExpr>());
3328   return new(buffer) PseudoObjectExpr(sh, numSemanticExprs);
3329 }
3330 
3331 PseudoObjectExpr::PseudoObjectExpr(EmptyShell shell, unsigned numSemanticExprs)
3332   : Expr(PseudoObjectExprClass, shell) {
3333   PseudoObjectExprBits.NumSubExprs = numSemanticExprs + 1;
3334 }
3335 
3336 PseudoObjectExpr *PseudoObjectExpr::Create(ASTContext &C, Expr *syntax,
3337                                            ArrayRef<Expr*> semantics,
3338                                            unsigned resultIndex) {
3339   assert(syntax && "no syntactic expression!");
3340   assert(semantics.size() && "no semantic expressions!");
3341 
3342   QualType type;
3343   ExprValueKind VK;
3344   if (resultIndex == NoResult) {
3345     type = C.VoidTy;
3346     VK = VK_RValue;
3347   } else {
3348     assert(resultIndex < semantics.size());
3349     type = semantics[resultIndex]->getType();
3350     VK = semantics[resultIndex]->getValueKind();
3351     assert(semantics[resultIndex]->getObjectKind() == OK_Ordinary);
3352   }
3353 
3354   void *buffer = C.Allocate(sizeof(PseudoObjectExpr) +
3355                               (1 + semantics.size()) * sizeof(Expr*),
3356                             llvm::alignOf<PseudoObjectExpr>());
3357   return new(buffer) PseudoObjectExpr(type, VK, syntax, semantics,
3358                                       resultIndex);
3359 }
3360 
3361 PseudoObjectExpr::PseudoObjectExpr(QualType type, ExprValueKind VK,
3362                                    Expr *syntax, ArrayRef<Expr*> semantics,
3363                                    unsigned resultIndex)
3364   : Expr(PseudoObjectExprClass, type, VK, OK_Ordinary,
3365          /*filled in at end of ctor*/ false, false, false, false) {
3366   PseudoObjectExprBits.NumSubExprs = semantics.size() + 1;
3367   PseudoObjectExprBits.ResultIndex = resultIndex + 1;
3368 
3369   for (unsigned i = 0, e = semantics.size() + 1; i != e; ++i) {
3370     Expr *E = (i == 0 ? syntax : semantics[i-1]);
3371     getSubExprsBuffer()[i] = E;
3372 
3373     if (E->isTypeDependent())
3374       ExprBits.TypeDependent = true;
3375     if (E->isValueDependent())
3376       ExprBits.ValueDependent = true;
3377     if (E->isInstantiationDependent())
3378       ExprBits.InstantiationDependent = true;
3379     if (E->containsUnexpandedParameterPack())
3380       ExprBits.ContainsUnexpandedParameterPack = true;
3381 
3382     if (isa<OpaqueValueExpr>(E))
3383       assert(cast<OpaqueValueExpr>(E)->getSourceExpr() != 0 &&
3384              "opaque-value semantic expressions for pseudo-object "
3385              "operations must have sources");
3386   }
3387 }
3388 
3389 //===----------------------------------------------------------------------===//
3390 //  ExprIterator.
3391 //===----------------------------------------------------------------------===//
3392 
3393 Expr* ExprIterator::operator[](size_t idx) { return cast<Expr>(I[idx]); }
3394 Expr* ExprIterator::operator*() const { return cast<Expr>(*I); }
3395 Expr* ExprIterator::operator->() const { return cast<Expr>(*I); }
3396 const Expr* ConstExprIterator::operator[](size_t idx) const {
3397   return cast<Expr>(I[idx]);
3398 }
3399 const Expr* ConstExprIterator::operator*() const { return cast<Expr>(*I); }
3400 const Expr* ConstExprIterator::operator->() const { return cast<Expr>(*I); }
3401 
3402 //===----------------------------------------------------------------------===//
3403 //  Child Iterators for iterating over subexpressions/substatements
3404 //===----------------------------------------------------------------------===//
3405 
3406 // UnaryExprOrTypeTraitExpr
3407 Stmt::child_range UnaryExprOrTypeTraitExpr::children() {
3408   // If this is of a type and the type is a VLA type (and not a typedef), the
3409   // size expression of the VLA needs to be treated as an executable expression.
3410   // Why isn't this weirdness documented better in StmtIterator?
3411   if (isArgumentType()) {
3412     if (const VariableArrayType* T = dyn_cast<VariableArrayType>(
3413                                    getArgumentType().getTypePtr()))
3414       return child_range(child_iterator(T), child_iterator());
3415     return child_range();
3416   }
3417   return child_range(&Argument.Ex, &Argument.Ex + 1);
3418 }
3419 
3420 // ObjCMessageExpr
3421 Stmt::child_range ObjCMessageExpr::children() {
3422   Stmt **begin;
3423   if (getReceiverKind() == Instance)
3424     begin = reinterpret_cast<Stmt **>(this + 1);
3425   else
3426     begin = reinterpret_cast<Stmt **>(getArgs());
3427   return child_range(begin,
3428                      reinterpret_cast<Stmt **>(getArgs() + getNumArgs()));
3429 }
3430 
3431 ObjCArrayLiteral::ObjCArrayLiteral(llvm::ArrayRef<Expr *> Elements,
3432                                    QualType T, ObjCMethodDecl *Method,
3433                                    SourceRange SR)
3434   : Expr(ObjCArrayLiteralClass, T, VK_RValue, OK_Ordinary,
3435          false, false, false, false),
3436     NumElements(Elements.size()), Range(SR), ArrayWithObjectsMethod(Method)
3437 {
3438   Expr **SaveElements = getElements();
3439   for (unsigned I = 0, N = Elements.size(); I != N; ++I) {
3440     if (Elements[I]->isTypeDependent() || Elements[I]->isValueDependent())
3441       ExprBits.ValueDependent = true;
3442     if (Elements[I]->isInstantiationDependent())
3443       ExprBits.InstantiationDependent = true;
3444     if (Elements[I]->containsUnexpandedParameterPack())
3445       ExprBits.ContainsUnexpandedParameterPack = true;
3446 
3447     SaveElements[I] = Elements[I];
3448   }
3449 }
3450 
3451 ObjCArrayLiteral *ObjCArrayLiteral::Create(ASTContext &C,
3452                                            llvm::ArrayRef<Expr *> Elements,
3453                                            QualType T, ObjCMethodDecl * Method,
3454                                            SourceRange SR) {
3455   void *Mem = C.Allocate(sizeof(ObjCArrayLiteral)
3456                          + Elements.size() * sizeof(Expr *));
3457   return new (Mem) ObjCArrayLiteral(Elements, T, Method, SR);
3458 }
3459 
3460 ObjCArrayLiteral *ObjCArrayLiteral::CreateEmpty(ASTContext &C,
3461                                                 unsigned NumElements) {
3462 
3463   void *Mem = C.Allocate(sizeof(ObjCArrayLiteral)
3464                          + NumElements * sizeof(Expr *));
3465   return new (Mem) ObjCArrayLiteral(EmptyShell(), NumElements);
3466 }
3467 
3468 ObjCDictionaryLiteral::ObjCDictionaryLiteral(
3469                                              ArrayRef<ObjCDictionaryElement> VK,
3470                                              bool HasPackExpansions,
3471                                              QualType T, ObjCMethodDecl *method,
3472                                              SourceRange SR)
3473   : Expr(ObjCDictionaryLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
3474          false, false),
3475     NumElements(VK.size()), HasPackExpansions(HasPackExpansions), Range(SR),
3476     DictWithObjectsMethod(method)
3477 {
3478   KeyValuePair *KeyValues = getKeyValues();
3479   ExpansionData *Expansions = getExpansionData();
3480   for (unsigned I = 0; I < NumElements; I++) {
3481     if (VK[I].Key->isTypeDependent() || VK[I].Key->isValueDependent() ||
3482         VK[I].Value->isTypeDependent() || VK[I].Value->isValueDependent())
3483       ExprBits.ValueDependent = true;
3484     if (VK[I].Key->isInstantiationDependent() ||
3485         VK[I].Value->isInstantiationDependent())
3486       ExprBits.InstantiationDependent = true;
3487     if (VK[I].EllipsisLoc.isInvalid() &&
3488         (VK[I].Key->containsUnexpandedParameterPack() ||
3489          VK[I].Value->containsUnexpandedParameterPack()))
3490       ExprBits.ContainsUnexpandedParameterPack = true;
3491 
3492     KeyValues[I].Key = VK[I].Key;
3493     KeyValues[I].Value = VK[I].Value;
3494     if (Expansions) {
3495       Expansions[I].EllipsisLoc = VK[I].EllipsisLoc;
3496       if (VK[I].NumExpansions)
3497         Expansions[I].NumExpansionsPlusOne = *VK[I].NumExpansions + 1;
3498       else
3499         Expansions[I].NumExpansionsPlusOne = 0;
3500     }
3501   }
3502 }
3503 
3504 ObjCDictionaryLiteral *
3505 ObjCDictionaryLiteral::Create(ASTContext &C,
3506                               ArrayRef<ObjCDictionaryElement> VK,
3507                               bool HasPackExpansions,
3508                               QualType T, ObjCMethodDecl *method,
3509                               SourceRange SR) {
3510   unsigned ExpansionsSize = 0;
3511   if (HasPackExpansions)
3512     ExpansionsSize = sizeof(ExpansionData) * VK.size();
3513 
3514   void *Mem = C.Allocate(sizeof(ObjCDictionaryLiteral) +
3515                          sizeof(KeyValuePair) * VK.size() + ExpansionsSize);
3516   return new (Mem) ObjCDictionaryLiteral(VK, HasPackExpansions, T, method, SR);
3517 }
3518 
3519 ObjCDictionaryLiteral *
3520 ObjCDictionaryLiteral::CreateEmpty(ASTContext &C, unsigned NumElements,
3521                                    bool HasPackExpansions) {
3522   unsigned ExpansionsSize = 0;
3523   if (HasPackExpansions)
3524     ExpansionsSize = sizeof(ExpansionData) * NumElements;
3525   void *Mem = C.Allocate(sizeof(ObjCDictionaryLiteral) +
3526                          sizeof(KeyValuePair) * NumElements + ExpansionsSize);
3527   return new (Mem) ObjCDictionaryLiteral(EmptyShell(), NumElements,
3528                                          HasPackExpansions);
3529 }
3530 
3531 ObjCSubscriptRefExpr *ObjCSubscriptRefExpr::Create(ASTContext &C,
3532                                                    Expr *base,
3533                                                    Expr *key, QualType T,
3534                                                    ObjCMethodDecl *getMethod,
3535                                                    ObjCMethodDecl *setMethod,
3536                                                    SourceLocation RB) {
3537   void *Mem = C.Allocate(sizeof(ObjCSubscriptRefExpr));
3538   return new (Mem) ObjCSubscriptRefExpr(base, key, T, VK_LValue,
3539                                         OK_ObjCSubscript,
3540                                         getMethod, setMethod, RB);
3541 }
3542 
3543 AtomicExpr::AtomicExpr(SourceLocation BLoc, Expr **args, unsigned nexpr,
3544                        QualType t, AtomicOp op, SourceLocation RP)
3545   : Expr(AtomicExprClass, t, VK_RValue, OK_Ordinary,
3546          false, false, false, false),
3547     NumSubExprs(nexpr), BuiltinLoc(BLoc), RParenLoc(RP), Op(op)
3548 {
3549   assert(nexpr == getNumSubExprs(op) && "wrong number of subexpressions");
3550   for (unsigned i = 0; i < nexpr; i++) {
3551     if (args[i]->isTypeDependent())
3552       ExprBits.TypeDependent = true;
3553     if (args[i]->isValueDependent())
3554       ExprBits.ValueDependent = true;
3555     if (args[i]->isInstantiationDependent())
3556       ExprBits.InstantiationDependent = true;
3557     if (args[i]->containsUnexpandedParameterPack())
3558       ExprBits.ContainsUnexpandedParameterPack = true;
3559 
3560     SubExprs[i] = args[i];
3561   }
3562 }
3563 
3564 unsigned AtomicExpr::getNumSubExprs(AtomicOp Op) {
3565   switch (Op) {
3566   case AO__c11_atomic_init:
3567   case AO__c11_atomic_load:
3568   case AO__atomic_load_n:
3569     return 2;
3570 
3571   case AO__c11_atomic_store:
3572   case AO__c11_atomic_exchange:
3573   case AO__atomic_load:
3574   case AO__atomic_store:
3575   case AO__atomic_store_n:
3576   case AO__atomic_exchange_n:
3577   case AO__c11_atomic_fetch_add:
3578   case AO__c11_atomic_fetch_sub:
3579   case AO__c11_atomic_fetch_and:
3580   case AO__c11_atomic_fetch_or:
3581   case AO__c11_atomic_fetch_xor:
3582   case AO__atomic_fetch_add:
3583   case AO__atomic_fetch_sub:
3584   case AO__atomic_fetch_and:
3585   case AO__atomic_fetch_or:
3586   case AO__atomic_fetch_xor:
3587   case AO__atomic_fetch_nand:
3588   case AO__atomic_add_fetch:
3589   case AO__atomic_sub_fetch:
3590   case AO__atomic_and_fetch:
3591   case AO__atomic_or_fetch:
3592   case AO__atomic_xor_fetch:
3593   case AO__atomic_nand_fetch:
3594     return 3;
3595 
3596   case AO__atomic_exchange:
3597     return 4;
3598 
3599   case AO__c11_atomic_compare_exchange_strong:
3600   case AO__c11_atomic_compare_exchange_weak:
3601     return 5;
3602 
3603   case AO__atomic_compare_exchange:
3604   case AO__atomic_compare_exchange_n:
3605     return 6;
3606   }
3607   llvm_unreachable("unknown atomic op");
3608 }
3609