Home | History | Annotate | Download | only in AST
      1 //===--- ExprObjC.h - Classes for representing ObjC expressions -*- C++ -*-===//
      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 defines the ExprObjC interface and subclasses.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_AST_EXPROBJC_H
     15 #define LLVM_CLANG_AST_EXPROBJC_H
     16 
     17 #include "clang/AST/DeclObjC.h"
     18 #include "clang/AST/Expr.h"
     19 #include "clang/AST/SelectorLocationsKind.h"
     20 #include "clang/Basic/IdentifierTable.h"
     21 #include "llvm/Support/Compiler.h"
     22 
     23 namespace clang {
     24   class IdentifierInfo;
     25   class ASTContext;
     26 
     27 /// ObjCStringLiteral, used for Objective-C string literals
     28 /// i.e. @"foo".
     29 class ObjCStringLiteral : public Expr {
     30   Stmt *String;
     31   SourceLocation AtLoc;
     32 public:
     33   ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L)
     34     : Expr(ObjCStringLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
     35            false, false),
     36       String(SL), AtLoc(L) {}
     37   explicit ObjCStringLiteral(EmptyShell Empty)
     38     : Expr(ObjCStringLiteralClass, Empty) {}
     39 
     40   StringLiteral *getString() { return cast<StringLiteral>(String); }
     41   const StringLiteral *getString() const { return cast<StringLiteral>(String); }
     42   void setString(StringLiteral *S) { String = S; }
     43 
     44   SourceLocation getAtLoc() const { return AtLoc; }
     45   void setAtLoc(SourceLocation L) { AtLoc = L; }
     46 
     47   SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; }
     48   SourceLocation getLocEnd() const LLVM_READONLY { return String->getLocEnd(); }
     49 
     50   static bool classof(const Stmt *T) {
     51     return T->getStmtClass() == ObjCStringLiteralClass;
     52   }
     53 
     54   // Iterators
     55   child_range children() { return child_range(&String, &String+1); }
     56 };
     57 
     58 /// ObjCBoolLiteralExpr - Objective-C Boolean Literal.
     59 ///
     60 class ObjCBoolLiteralExpr : public Expr {
     61   bool Value;
     62   SourceLocation Loc;
     63 public:
     64   ObjCBoolLiteralExpr(bool val, QualType Ty, SourceLocation l) :
     65   Expr(ObjCBoolLiteralExprClass, Ty, VK_RValue, OK_Ordinary, false, false,
     66        false, false), Value(val), Loc(l) {}
     67 
     68   explicit ObjCBoolLiteralExpr(EmptyShell Empty)
     69   : Expr(ObjCBoolLiteralExprClass, Empty) { }
     70 
     71   bool getValue() const { return Value; }
     72   void setValue(bool V) { Value = V; }
     73 
     74   SourceLocation getLocStart() const LLVM_READONLY { return Loc; }
     75   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
     76 
     77   SourceLocation getLocation() const { return Loc; }
     78   void setLocation(SourceLocation L) { Loc = L; }
     79 
     80   static bool classof(const Stmt *T) {
     81     return T->getStmtClass() == ObjCBoolLiteralExprClass;
     82   }
     83 
     84   // Iterators
     85   child_range children() { return child_range(); }
     86 };
     87 
     88 /// ObjCBoxedExpr - used for generalized expression boxing.
     89 /// as in: @(strdup("hello world")) or @(random())
     90 /// Also used for boxing non-parenthesized numeric literals;
     91 /// as in: @42 or \@true (c++/objc++) or \@__yes (c/objc).
     92 class ObjCBoxedExpr : public Expr {
     93   Stmt *SubExpr;
     94   ObjCMethodDecl *BoxingMethod;
     95   SourceRange Range;
     96 public:
     97   ObjCBoxedExpr(Expr *E, QualType T, ObjCMethodDecl *method,
     98                      SourceRange R)
     99   : Expr(ObjCBoxedExprClass, T, VK_RValue, OK_Ordinary,
    100          E->isTypeDependent(), E->isValueDependent(),
    101          E->isInstantiationDependent(), E->containsUnexpandedParameterPack()),
    102          SubExpr(E), BoxingMethod(method), Range(R) {}
    103   explicit ObjCBoxedExpr(EmptyShell Empty)
    104   : Expr(ObjCBoxedExprClass, Empty) {}
    105 
    106   Expr *getSubExpr() { return cast<Expr>(SubExpr); }
    107   const Expr *getSubExpr() const { return cast<Expr>(SubExpr); }
    108 
    109   ObjCMethodDecl *getBoxingMethod() const {
    110     return BoxingMethod;
    111   }
    112 
    113   SourceLocation getAtLoc() const { return Range.getBegin(); }
    114 
    115   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
    116   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
    117   SourceRange getSourceRange() const LLVM_READONLY {
    118     return Range;
    119   }
    120 
    121   static bool classof(const Stmt *T) {
    122     return T->getStmtClass() == ObjCBoxedExprClass;
    123   }
    124 
    125   // Iterators
    126   child_range children() { return child_range(&SubExpr, &SubExpr+1); }
    127 
    128   friend class ASTStmtReader;
    129 };
    130 
    131 /// ObjCArrayLiteral - used for objective-c array containers; as in:
    132 /// @[@"Hello", NSApp, [NSNumber numberWithInt:42]];
    133 class ObjCArrayLiteral : public Expr {
    134   unsigned NumElements;
    135   SourceRange Range;
    136   ObjCMethodDecl *ArrayWithObjectsMethod;
    137 
    138   ObjCArrayLiteral(ArrayRef<Expr *> Elements,
    139                    QualType T, ObjCMethodDecl * Method,
    140                    SourceRange SR);
    141 
    142   explicit ObjCArrayLiteral(EmptyShell Empty, unsigned NumElements)
    143     : Expr(ObjCArrayLiteralClass, Empty), NumElements(NumElements) {}
    144 
    145 public:
    146   static ObjCArrayLiteral *Create(const ASTContext &C,
    147                                   ArrayRef<Expr *> Elements,
    148                                   QualType T, ObjCMethodDecl * Method,
    149                                   SourceRange SR);
    150 
    151   static ObjCArrayLiteral *CreateEmpty(const ASTContext &C,
    152                                        unsigned NumElements);
    153 
    154   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
    155   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
    156   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
    157 
    158   static bool classof(const Stmt *T) {
    159       return T->getStmtClass() == ObjCArrayLiteralClass;
    160   }
    161 
    162   /// \brief Retrieve elements of array of literals.
    163   Expr **getElements() { return reinterpret_cast<Expr **>(this + 1); }
    164 
    165   /// \brief Retrieve elements of array of literals.
    166   const Expr * const *getElements() const {
    167     return reinterpret_cast<const Expr * const*>(this + 1);
    168   }
    169 
    170   /// getNumElements - Return number of elements of objective-c array literal.
    171   unsigned getNumElements() const { return NumElements; }
    172 
    173     /// getExpr - Return the Expr at the specified index.
    174   Expr *getElement(unsigned Index) {
    175     assert((Index < NumElements) && "Arg access out of range!");
    176     return cast<Expr>(getElements()[Index]);
    177   }
    178   const Expr *getElement(unsigned Index) const {
    179     assert((Index < NumElements) && "Arg access out of range!");
    180     return cast<Expr>(getElements()[Index]);
    181   }
    182 
    183   ObjCMethodDecl *getArrayWithObjectsMethod() const {
    184     return ArrayWithObjectsMethod;
    185   }
    186 
    187   // Iterators
    188   child_range children() {
    189     return child_range((Stmt **)getElements(),
    190                        (Stmt **)getElements() + NumElements);
    191   }
    192 
    193   friend class ASTStmtReader;
    194 };
    195 
    196 /// \brief An element in an Objective-C dictionary literal.
    197 ///
    198 struct ObjCDictionaryElement {
    199   /// \brief The key for the dictionary element.
    200   Expr *Key;
    201 
    202   /// \brief The value of the dictionary element.
    203   Expr *Value;
    204 
    205   /// \brief The location of the ellipsis, if this is a pack expansion.
    206   SourceLocation EllipsisLoc;
    207 
    208   /// \brief The number of elements this pack expansion will expand to, if
    209   /// this is a pack expansion and is known.
    210   Optional<unsigned> NumExpansions;
    211 
    212   /// \brief Determines whether this dictionary element is a pack expansion.
    213   bool isPackExpansion() const { return EllipsisLoc.isValid(); }
    214 };
    215 } // end namespace clang
    216 
    217 namespace llvm {
    218 template <> struct isPodLike<clang::ObjCDictionaryElement> : std::true_type {};
    219 }
    220 
    221 namespace clang {
    222 /// ObjCDictionaryLiteral - AST node to represent objective-c dictionary
    223 /// literals; as in:  @{@"name" : NSUserName(), @"date" : [NSDate date] };
    224 class ObjCDictionaryLiteral : public Expr {
    225   /// \brief Key/value pair used to store the key and value of a given element.
    226   ///
    227   /// Objects of this type are stored directly after the expression.
    228   struct KeyValuePair {
    229     Expr *Key;
    230     Expr *Value;
    231   };
    232 
    233   /// \brief Data that describes an element that is a pack expansion, used if any
    234   /// of the elements in the dictionary literal are pack expansions.
    235   struct ExpansionData {
    236     /// \brief The location of the ellipsis, if this element is a pack
    237     /// expansion.
    238     SourceLocation EllipsisLoc;
    239 
    240     /// \brief If non-zero, the number of elements that this pack
    241     /// expansion will expand to (+1).
    242     unsigned NumExpansionsPlusOne;
    243   };
    244 
    245   /// \brief The number of elements in this dictionary literal.
    246   unsigned NumElements : 31;
    247 
    248   /// \brief Determine whether this dictionary literal has any pack expansions.
    249   ///
    250   /// If the dictionary literal has pack expansions, then there will
    251   /// be an array of pack expansion data following the array of
    252   /// key/value pairs, which provide the locations of the ellipses (if
    253   /// any) and number of elements in the expansion (if known). If
    254   /// there are no pack expansions, we optimize away this storage.
    255   unsigned HasPackExpansions : 1;
    256 
    257   SourceRange Range;
    258   ObjCMethodDecl *DictWithObjectsMethod;
    259 
    260   ObjCDictionaryLiteral(ArrayRef<ObjCDictionaryElement> VK,
    261                         bool HasPackExpansions,
    262                         QualType T, ObjCMethodDecl *method,
    263                         SourceRange SR);
    264 
    265   explicit ObjCDictionaryLiteral(EmptyShell Empty, unsigned NumElements,
    266                                  bool HasPackExpansions)
    267     : Expr(ObjCDictionaryLiteralClass, Empty), NumElements(NumElements),
    268       HasPackExpansions(HasPackExpansions) {}
    269 
    270   KeyValuePair *getKeyValues() {
    271     return reinterpret_cast<KeyValuePair *>(this + 1);
    272   }
    273 
    274   const KeyValuePair *getKeyValues() const {
    275     return reinterpret_cast<const KeyValuePair *>(this + 1);
    276   }
    277 
    278   ExpansionData *getExpansionData() {
    279     if (!HasPackExpansions)
    280       return nullptr;
    281 
    282     return reinterpret_cast<ExpansionData *>(getKeyValues() + NumElements);
    283   }
    284 
    285   const ExpansionData *getExpansionData() const {
    286     if (!HasPackExpansions)
    287       return nullptr;
    288 
    289     return reinterpret_cast<const ExpansionData *>(getKeyValues()+NumElements);
    290   }
    291 
    292 public:
    293   static ObjCDictionaryLiteral *Create(const ASTContext &C,
    294                                        ArrayRef<ObjCDictionaryElement> VK,
    295                                        bool HasPackExpansions,
    296                                        QualType T, ObjCMethodDecl *method,
    297                                        SourceRange SR);
    298 
    299   static ObjCDictionaryLiteral *CreateEmpty(const ASTContext &C,
    300                                             unsigned NumElements,
    301                                             bool HasPackExpansions);
    302 
    303   /// getNumElements - Return number of elements of objective-c dictionary
    304   /// literal.
    305   unsigned getNumElements() const { return NumElements; }
    306 
    307   ObjCDictionaryElement getKeyValueElement(unsigned Index) const {
    308     assert((Index < NumElements) && "Arg access out of range!");
    309     const KeyValuePair &KV = getKeyValues()[Index];
    310     ObjCDictionaryElement Result = { KV.Key, KV.Value, SourceLocation(), None };
    311     if (HasPackExpansions) {
    312       const ExpansionData &Expansion = getExpansionData()[Index];
    313       Result.EllipsisLoc = Expansion.EllipsisLoc;
    314       if (Expansion.NumExpansionsPlusOne > 0)
    315         Result.NumExpansions = Expansion.NumExpansionsPlusOne - 1;
    316     }
    317     return Result;
    318   }
    319 
    320   ObjCMethodDecl *getDictWithObjectsMethod() const
    321     { return DictWithObjectsMethod; }
    322 
    323   SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); }
    324   SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); }
    325   SourceRange getSourceRange() const LLVM_READONLY { return Range; }
    326 
    327   static bool classof(const Stmt *T) {
    328       return T->getStmtClass() == ObjCDictionaryLiteralClass;
    329   }
    330 
    331   // Iterators
    332   child_range children() {
    333     // Note: we're taking advantage of the layout of the KeyValuePair struct
    334     // here. If that struct changes, this code will need to change as well.
    335     return child_range(reinterpret_cast<Stmt **>(this + 1),
    336                        reinterpret_cast<Stmt **>(this + 1) + NumElements * 2);
    337   }
    338 
    339   friend class ASTStmtReader;
    340   friend class ASTStmtWriter;
    341 };
    342 
    343 
    344 /// ObjCEncodeExpr, used for \@encode in Objective-C.  \@encode has the same
    345 /// type and behavior as StringLiteral except that the string initializer is
    346 /// obtained from ASTContext with the encoding type as an argument.
    347 class ObjCEncodeExpr : public Expr {
    348   TypeSourceInfo *EncodedType;
    349   SourceLocation AtLoc, RParenLoc;
    350 public:
    351   ObjCEncodeExpr(QualType T, TypeSourceInfo *EncodedType,
    352                  SourceLocation at, SourceLocation rp)
    353     : Expr(ObjCEncodeExprClass, T, VK_LValue, OK_Ordinary,
    354            EncodedType->getType()->isDependentType(),
    355            EncodedType->getType()->isDependentType(),
    356            EncodedType->getType()->isInstantiationDependentType(),
    357            EncodedType->getType()->containsUnexpandedParameterPack()),
    358       EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {}
    359 
    360   explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){}
    361 
    362 
    363   SourceLocation getAtLoc() const { return AtLoc; }
    364   void setAtLoc(SourceLocation L) { AtLoc = L; }
    365   SourceLocation getRParenLoc() const { return RParenLoc; }
    366   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    367 
    368   QualType getEncodedType() const { return EncodedType->getType(); }
    369 
    370   TypeSourceInfo *getEncodedTypeSourceInfo() const { return EncodedType; }
    371   void setEncodedTypeSourceInfo(TypeSourceInfo *EncType) {
    372     EncodedType = EncType;
    373   }
    374 
    375   SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; }
    376   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    377 
    378   static bool classof(const Stmt *T) {
    379     return T->getStmtClass() == ObjCEncodeExprClass;
    380   }
    381 
    382   // Iterators
    383   child_range children() { return child_range(); }
    384 };
    385 
    386 /// ObjCSelectorExpr used for \@selector in Objective-C.
    387 class ObjCSelectorExpr : public Expr {
    388   Selector SelName;
    389   SourceLocation AtLoc, RParenLoc;
    390 public:
    391   ObjCSelectorExpr(QualType T, Selector selInfo,
    392                    SourceLocation at, SourceLocation rp)
    393     : Expr(ObjCSelectorExprClass, T, VK_RValue, OK_Ordinary, false, false,
    394            false, false),
    395     SelName(selInfo), AtLoc(at), RParenLoc(rp){}
    396   explicit ObjCSelectorExpr(EmptyShell Empty)
    397    : Expr(ObjCSelectorExprClass, Empty) {}
    398 
    399   Selector getSelector() const { return SelName; }
    400   void setSelector(Selector S) { SelName = S; }
    401 
    402   SourceLocation getAtLoc() const { return AtLoc; }
    403   SourceLocation getRParenLoc() const { return RParenLoc; }
    404   void setAtLoc(SourceLocation L) { AtLoc = L; }
    405   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    406 
    407   SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; }
    408   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    409 
    410   /// getNumArgs - Return the number of actual arguments to this call.
    411   unsigned getNumArgs() const { return SelName.getNumArgs(); }
    412 
    413   static bool classof(const Stmt *T) {
    414     return T->getStmtClass() == ObjCSelectorExprClass;
    415   }
    416 
    417   // Iterators
    418   child_range children() { return child_range(); }
    419 };
    420 
    421 /// ObjCProtocolExpr used for protocol expression in Objective-C.
    422 ///
    423 /// This is used as: \@protocol(foo), as in:
    424 /// \code
    425 ///   [obj conformsToProtocol:@protocol(foo)]
    426 /// \endcode
    427 ///
    428 /// The return type is "Protocol*".
    429 class ObjCProtocolExpr : public Expr {
    430   ObjCProtocolDecl *TheProtocol;
    431   SourceLocation AtLoc, ProtoLoc, RParenLoc;
    432 public:
    433   ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol,
    434                  SourceLocation at, SourceLocation protoLoc, SourceLocation rp)
    435     : Expr(ObjCProtocolExprClass, T, VK_RValue, OK_Ordinary, false, false,
    436            false, false),
    437       TheProtocol(protocol), AtLoc(at), ProtoLoc(protoLoc), RParenLoc(rp) {}
    438   explicit ObjCProtocolExpr(EmptyShell Empty)
    439     : Expr(ObjCProtocolExprClass, Empty) {}
    440 
    441   ObjCProtocolDecl *getProtocol() const { return TheProtocol; }
    442   void setProtocol(ObjCProtocolDecl *P) { TheProtocol = P; }
    443 
    444   SourceLocation getProtocolIdLoc() const { return ProtoLoc; }
    445   SourceLocation getAtLoc() const { return AtLoc; }
    446   SourceLocation getRParenLoc() const { return RParenLoc; }
    447   void setAtLoc(SourceLocation L) { AtLoc = L; }
    448   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
    449 
    450   SourceLocation getLocStart() const LLVM_READONLY { return AtLoc; }
    451   SourceLocation getLocEnd() const LLVM_READONLY { return RParenLoc; }
    452 
    453   static bool classof(const Stmt *T) {
    454     return T->getStmtClass() == ObjCProtocolExprClass;
    455   }
    456 
    457   // Iterators
    458   child_range children() { return child_range(); }
    459 
    460   friend class ASTStmtReader;
    461   friend class ASTStmtWriter;
    462 };
    463 
    464 /// ObjCIvarRefExpr - A reference to an ObjC instance variable.
    465 class ObjCIvarRefExpr : public Expr {
    466   ObjCIvarDecl *D;
    467   Stmt *Base;
    468   SourceLocation Loc;
    469   /// OpLoc - This is the location of '.' or '->'
    470   SourceLocation OpLoc;
    471 
    472   bool IsArrow:1;      // True if this is "X->F", false if this is "X.F".
    473   bool IsFreeIvar:1;   // True if ivar reference has no base (self assumed).
    474 
    475 public:
    476   ObjCIvarRefExpr(ObjCIvarDecl *d, QualType t,
    477                   SourceLocation l, SourceLocation oploc,
    478                   Expr *base,
    479                   bool arrow = false, bool freeIvar = false) :
    480     Expr(ObjCIvarRefExprClass, t, VK_LValue,
    481          d->isBitField() ? OK_BitField : OK_Ordinary,
    482          /*TypeDependent=*/false, base->isValueDependent(),
    483          base->isInstantiationDependent(),
    484          base->containsUnexpandedParameterPack()),
    485     D(d), Base(base), Loc(l), OpLoc(oploc),
    486     IsArrow(arrow), IsFreeIvar(freeIvar) {}
    487 
    488   explicit ObjCIvarRefExpr(EmptyShell Empty)
    489     : Expr(ObjCIvarRefExprClass, Empty) {}
    490 
    491   ObjCIvarDecl *getDecl() { return D; }
    492   const ObjCIvarDecl *getDecl() const { return D; }
    493   void setDecl(ObjCIvarDecl *d) { D = d; }
    494 
    495   const Expr *getBase() const { return cast<Expr>(Base); }
    496   Expr *getBase() { return cast<Expr>(Base); }
    497   void setBase(Expr * base) { Base = base; }
    498 
    499   bool isArrow() const { return IsArrow; }
    500   bool isFreeIvar() const { return IsFreeIvar; }
    501   void setIsArrow(bool A) { IsArrow = A; }
    502   void setIsFreeIvar(bool A) { IsFreeIvar = A; }
    503 
    504   SourceLocation getLocation() const { return Loc; }
    505   void setLocation(SourceLocation L) { Loc = L; }
    506 
    507   SourceLocation getLocStart() const LLVM_READONLY {
    508     return isFreeIvar() ? Loc : getBase()->getLocStart();
    509   }
    510   SourceLocation getLocEnd() const LLVM_READONLY { return Loc; }
    511 
    512   SourceLocation getOpLoc() const { return OpLoc; }
    513   void setOpLoc(SourceLocation L) { OpLoc = L; }
    514 
    515   static bool classof(const Stmt *T) {
    516     return T->getStmtClass() == ObjCIvarRefExprClass;
    517   }
    518 
    519   // Iterators
    520   child_range children() { return child_range(&Base, &Base+1); }
    521 };
    522 
    523 /// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC
    524 /// property.
    525 class ObjCPropertyRefExpr : public Expr {
    526 private:
    527   /// If the bool is true, this is an implicit property reference; the
    528   /// pointer is an (optional) ObjCMethodDecl and Setter may be set.
    529   /// if the bool is false, this is an explicit property reference;
    530   /// the pointer is an ObjCPropertyDecl and Setter is always null.
    531   llvm::PointerIntPair<NamedDecl*, 1, bool> PropertyOrGetter;
    532 
    533   /// \brief Indicates whether the property reference will result in a message
    534   /// to the getter, the setter, or both.
    535   /// This applies to both implicit and explicit property references.
    536   enum MethodRefFlags {
    537     MethodRef_None = 0,
    538     MethodRef_Getter = 0x1,
    539     MethodRef_Setter = 0x2
    540   };
    541 
    542   /// \brief Contains the Setter method pointer and MethodRefFlags bit flags.
    543   llvm::PointerIntPair<ObjCMethodDecl *, 2, unsigned> SetterAndMethodRefFlags;
    544 
    545   // FIXME: Maybe we should store the property identifier here,
    546   // because it's not rederivable from the other data when there's an
    547   // implicit property with no getter (because the 'foo' -> 'setFoo:'
    548   // transformation is lossy on the first character).
    549 
    550   SourceLocation IdLoc;
    551 
    552   /// \brief When the receiver in property access is 'super', this is
    553   /// the location of the 'super' keyword.  When it's an interface,
    554   /// this is that interface.
    555   SourceLocation ReceiverLoc;
    556   llvm::PointerUnion3<Stmt*, const Type*, ObjCInterfaceDecl*> Receiver;
    557 
    558 public:
    559   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
    560                       ExprValueKind VK, ExprObjectKind OK,
    561                       SourceLocation l, Expr *base)
    562     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
    563            /*TypeDependent=*/false, base->isValueDependent(),
    564            base->isInstantiationDependent(),
    565            base->containsUnexpandedParameterPack()),
    566       PropertyOrGetter(PD, false), SetterAndMethodRefFlags(),
    567       IdLoc(l), ReceiverLoc(), Receiver(base) {
    568     assert(t->isSpecificPlaceholderType(BuiltinType::PseudoObject));
    569   }
    570 
    571   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
    572                       ExprValueKind VK, ExprObjectKind OK,
    573                       SourceLocation l, SourceLocation sl, QualType st)
    574     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
    575            /*TypeDependent=*/false, false, st->isInstantiationDependentType(),
    576            st->containsUnexpandedParameterPack()),
    577       PropertyOrGetter(PD, false), SetterAndMethodRefFlags(),
    578       IdLoc(l), ReceiverLoc(sl), Receiver(st.getTypePtr()) {
    579     assert(t->isSpecificPlaceholderType(BuiltinType::PseudoObject));
    580   }
    581 
    582   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
    583                       QualType T, ExprValueKind VK, ExprObjectKind OK,
    584                       SourceLocation IdLoc, Expr *Base)
    585     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false,
    586            Base->isValueDependent(), Base->isInstantiationDependent(),
    587            Base->containsUnexpandedParameterPack()),
    588       PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0),
    589       IdLoc(IdLoc), ReceiverLoc(), Receiver(Base) {
    590     assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject));
    591   }
    592 
    593   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
    594                       QualType T, ExprValueKind VK, ExprObjectKind OK,
    595                       SourceLocation IdLoc,
    596                       SourceLocation SuperLoc, QualType SuperTy)
    597     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
    598       PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0),
    599       IdLoc(IdLoc), ReceiverLoc(SuperLoc), Receiver(SuperTy.getTypePtr()) {
    600     assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject));
    601   }
    602 
    603   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
    604                       QualType T, ExprValueKind VK, ExprObjectKind OK,
    605                       SourceLocation IdLoc,
    606                       SourceLocation ReceiverLoc, ObjCInterfaceDecl *Receiver)
    607     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
    608       PropertyOrGetter(Getter, true), SetterAndMethodRefFlags(Setter, 0),
    609       IdLoc(IdLoc), ReceiverLoc(ReceiverLoc), Receiver(Receiver) {
    610     assert(T->isSpecificPlaceholderType(BuiltinType::PseudoObject));
    611   }
    612 
    613   explicit ObjCPropertyRefExpr(EmptyShell Empty)
    614     : Expr(ObjCPropertyRefExprClass, Empty) {}
    615 
    616   bool isImplicitProperty() const { return PropertyOrGetter.getInt(); }
    617   bool isExplicitProperty() const { return !PropertyOrGetter.getInt(); }
    618 
    619   ObjCPropertyDecl *getExplicitProperty() const {
    620     assert(!isImplicitProperty());
    621     return cast<ObjCPropertyDecl>(PropertyOrGetter.getPointer());
    622   }
    623 
    624   ObjCMethodDecl *getImplicitPropertyGetter() const {
    625     assert(isImplicitProperty());
    626     return cast_or_null<ObjCMethodDecl>(PropertyOrGetter.getPointer());
    627   }
    628 
    629   ObjCMethodDecl *getImplicitPropertySetter() const {
    630     assert(isImplicitProperty());
    631     return SetterAndMethodRefFlags.getPointer();
    632   }
    633 
    634   Selector getGetterSelector() const {
    635     if (isImplicitProperty())
    636       return getImplicitPropertyGetter()->getSelector();
    637     return getExplicitProperty()->getGetterName();
    638   }
    639 
    640   Selector getSetterSelector() const {
    641     if (isImplicitProperty())
    642       return getImplicitPropertySetter()->getSelector();
    643     return getExplicitProperty()->getSetterName();
    644   }
    645 
    646   /// \brief True if the property reference will result in a message to the
    647   /// getter.
    648   /// This applies to both implicit and explicit property references.
    649   bool isMessagingGetter() const {
    650     return SetterAndMethodRefFlags.getInt() & MethodRef_Getter;
    651   }
    652 
    653   /// \brief True if the property reference will result in a message to the
    654   /// setter.
    655   /// This applies to both implicit and explicit property references.
    656   bool isMessagingSetter() const {
    657     return SetterAndMethodRefFlags.getInt() & MethodRef_Setter;
    658   }
    659 
    660   void setIsMessagingGetter(bool val = true) {
    661     setMethodRefFlag(MethodRef_Getter, val);
    662   }
    663 
    664   void setIsMessagingSetter(bool val = true) {
    665     setMethodRefFlag(MethodRef_Setter, val);
    666   }
    667 
    668   const Expr *getBase() const {
    669     return cast<Expr>(Receiver.get<Stmt*>());
    670   }
    671   Expr *getBase() {
    672     return cast<Expr>(Receiver.get<Stmt*>());
    673   }
    674 
    675   SourceLocation getLocation() const { return IdLoc; }
    676 
    677   SourceLocation getReceiverLocation() const { return ReceiverLoc; }
    678   QualType getSuperReceiverType() const {
    679     return QualType(Receiver.get<const Type*>(), 0);
    680   }
    681   QualType getGetterResultType() const {
    682     QualType ResultType;
    683     if (isExplicitProperty()) {
    684       const ObjCPropertyDecl *PDecl = getExplicitProperty();
    685       if (const ObjCMethodDecl *Getter = PDecl->getGetterMethodDecl())
    686         ResultType = Getter->getReturnType();
    687       else
    688         ResultType = PDecl->getType();
    689     } else {
    690       const ObjCMethodDecl *Getter = getImplicitPropertyGetter();
    691       if (Getter)
    692         ResultType = Getter->getReturnType(); // with reference!
    693     }
    694     return ResultType;
    695   }
    696 
    697   QualType getSetterArgType() const {
    698     QualType ArgType;
    699     if (isImplicitProperty()) {
    700       const ObjCMethodDecl *Setter = getImplicitPropertySetter();
    701       ObjCMethodDecl::param_const_iterator P = Setter->param_begin();
    702       ArgType = (*P)->getType();
    703     } else {
    704       if (ObjCPropertyDecl *PDecl = getExplicitProperty())
    705         if (const ObjCMethodDecl *Setter = PDecl->getSetterMethodDecl()) {
    706           ObjCMethodDecl::param_const_iterator P = Setter->param_begin();
    707           ArgType = (*P)->getType();
    708         }
    709       if (ArgType.isNull())
    710         ArgType = getType();
    711     }
    712     return ArgType;
    713   }
    714 
    715   ObjCInterfaceDecl *getClassReceiver() const {
    716     return Receiver.get<ObjCInterfaceDecl*>();
    717   }
    718   bool isObjectReceiver() const { return Receiver.is<Stmt*>(); }
    719   bool isSuperReceiver() const { return Receiver.is<const Type*>(); }
    720   bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); }
    721 
    722   SourceLocation getLocStart() const LLVM_READONLY {
    723     return isObjectReceiver() ? getBase()->getLocStart() :getReceiverLocation();
    724   }
    725   SourceLocation getLocEnd() const LLVM_READONLY { return IdLoc; }
    726 
    727   static bool classof(const Stmt *T) {
    728     return T->getStmtClass() == ObjCPropertyRefExprClass;
    729   }
    730 
    731   // Iterators
    732   child_range children() {
    733     if (Receiver.is<Stmt*>()) {
    734       Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack!
    735       return child_range(begin, begin+1);
    736     }
    737     return child_range();
    738   }
    739 
    740 private:
    741   friend class ASTStmtReader;
    742   friend class ASTStmtWriter;
    743   void setExplicitProperty(ObjCPropertyDecl *D, unsigned methRefFlags) {
    744     PropertyOrGetter.setPointer(D);
    745     PropertyOrGetter.setInt(false);
    746     SetterAndMethodRefFlags.setPointer(nullptr);
    747     SetterAndMethodRefFlags.setInt(methRefFlags);
    748   }
    749   void setImplicitProperty(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
    750                            unsigned methRefFlags) {
    751     PropertyOrGetter.setPointer(Getter);
    752     PropertyOrGetter.setInt(true);
    753     SetterAndMethodRefFlags.setPointer(Setter);
    754     SetterAndMethodRefFlags.setInt(methRefFlags);
    755   }
    756   void setBase(Expr *Base) { Receiver = Base; }
    757   void setSuperReceiver(QualType T) { Receiver = T.getTypePtr(); }
    758   void setClassReceiver(ObjCInterfaceDecl *D) { Receiver = D; }
    759 
    760   void setLocation(SourceLocation L) { IdLoc = L; }
    761   void setReceiverLocation(SourceLocation Loc) { ReceiverLoc = Loc; }
    762 
    763   void setMethodRefFlag(MethodRefFlags flag, bool val) {
    764     unsigned f = SetterAndMethodRefFlags.getInt();
    765     if (val)
    766       f |= flag;
    767     else
    768       f &= ~flag;
    769     SetterAndMethodRefFlags.setInt(f);
    770   }
    771 };
    772 
    773 /// ObjCSubscriptRefExpr - used for array and dictionary subscripting.
    774 /// array[4] = array[3]; dictionary[key] = dictionary[alt_key];
    775 ///
    776 class ObjCSubscriptRefExpr : public Expr {
    777   // Location of ']' in an indexing expression.
    778   SourceLocation RBracket;
    779   // array/dictionary base expression.
    780   // for arrays, this is a numeric expression. For dictionaries, this is
    781   // an objective-c object pointer expression.
    782   enum { BASE, KEY, END_EXPR };
    783   Stmt* SubExprs[END_EXPR];
    784 
    785   ObjCMethodDecl *GetAtIndexMethodDecl;
    786 
    787   // For immutable objects this is null. When ObjCSubscriptRefExpr is to read
    788   // an indexed object this is null too.
    789   ObjCMethodDecl *SetAtIndexMethodDecl;
    790 
    791 public:
    792 
    793   ObjCSubscriptRefExpr(Expr *base, Expr *key, QualType T,
    794                        ExprValueKind VK, ExprObjectKind OK,
    795                        ObjCMethodDecl *getMethod,
    796                        ObjCMethodDecl *setMethod, SourceLocation RB)
    797     : Expr(ObjCSubscriptRefExprClass, T, VK, OK,
    798            base->isTypeDependent() || key->isTypeDependent(),
    799            base->isValueDependent() || key->isValueDependent(),
    800            base->isInstantiationDependent() || key->isInstantiationDependent(),
    801            (base->containsUnexpandedParameterPack() ||
    802             key->containsUnexpandedParameterPack())),
    803       RBracket(RB),
    804   GetAtIndexMethodDecl(getMethod),
    805   SetAtIndexMethodDecl(setMethod)
    806     {SubExprs[BASE] = base; SubExprs[KEY] = key;}
    807 
    808   explicit ObjCSubscriptRefExpr(EmptyShell Empty)
    809     : Expr(ObjCSubscriptRefExprClass, Empty) {}
    810 
    811   static ObjCSubscriptRefExpr *Create(const ASTContext &C,
    812                                       Expr *base,
    813                                       Expr *key, QualType T,
    814                                       ObjCMethodDecl *getMethod,
    815                                       ObjCMethodDecl *setMethod,
    816                                       SourceLocation RB);
    817 
    818   SourceLocation getRBracket() const { return RBracket; }
    819   void setRBracket(SourceLocation RB) { RBracket = RB; }
    820 
    821   SourceLocation getLocStart() const LLVM_READONLY {
    822     return SubExprs[BASE]->getLocStart();
    823   }
    824   SourceLocation getLocEnd() const LLVM_READONLY { return RBracket; }
    825 
    826   static bool classof(const Stmt *T) {
    827     return T->getStmtClass() == ObjCSubscriptRefExprClass;
    828   }
    829 
    830   Expr *getBaseExpr() const { return cast<Expr>(SubExprs[BASE]); }
    831   void setBaseExpr(Stmt *S) { SubExprs[BASE] = S; }
    832 
    833   Expr *getKeyExpr() const { return cast<Expr>(SubExprs[KEY]); }
    834   void setKeyExpr(Stmt *S) { SubExprs[KEY] = S; }
    835 
    836   ObjCMethodDecl *getAtIndexMethodDecl() const {
    837     return GetAtIndexMethodDecl;
    838   }
    839 
    840   ObjCMethodDecl *setAtIndexMethodDecl() const {
    841     return SetAtIndexMethodDecl;
    842   }
    843 
    844   bool isArraySubscriptRefExpr() const {
    845     return getKeyExpr()->getType()->isIntegralOrEnumerationType();
    846   }
    847 
    848   child_range children() {
    849     return child_range(SubExprs, SubExprs+END_EXPR);
    850   }
    851 private:
    852   friend class ASTStmtReader;
    853 };
    854 
    855 
    856 /// \brief An expression that sends a message to the given Objective-C
    857 /// object or class.
    858 ///
    859 /// The following contains two message send expressions:
    860 ///
    861 /// \code
    862 ///   [[NSString alloc] initWithString:@"Hello"]
    863 /// \endcode
    864 ///
    865 /// The innermost message send invokes the "alloc" class method on the
    866 /// NSString class, while the outermost message send invokes the
    867 /// "initWithString" instance method on the object returned from
    868 /// NSString's "alloc". In all, an Objective-C message send can take
    869 /// on four different (although related) forms:
    870 ///
    871 ///   1. Send to an object instance.
    872 ///   2. Send to a class.
    873 ///   3. Send to the superclass instance of the current class.
    874 ///   4. Send to the superclass of the current class.
    875 ///
    876 /// All four kinds of message sends are modeled by the ObjCMessageExpr
    877 /// class, and can be distinguished via \c getReceiverKind(). Example:
    878 ///
    879 class ObjCMessageExpr : public Expr {
    880   /// \brief Stores either the selector that this message is sending
    881   /// to (when \c HasMethod is zero) or an \c ObjCMethodDecl pointer
    882   /// referring to the method that we type-checked against.
    883   uintptr_t SelectorOrMethod;
    884 
    885   enum { NumArgsBitWidth = 16 };
    886 
    887   /// \brief The number of arguments in the message send, not
    888   /// including the receiver.
    889   unsigned NumArgs : NumArgsBitWidth;
    890 
    891   void setNumArgs(unsigned Num) {
    892     assert((Num >> NumArgsBitWidth) == 0 && "Num of args is out of range!");
    893     NumArgs = Num;
    894   }
    895 
    896   /// \brief The kind of message send this is, which is one of the
    897   /// ReceiverKind values.
    898   ///
    899   /// We pad this out to a byte to avoid excessive masking and shifting.
    900   unsigned Kind : 8;
    901 
    902   /// \brief Whether we have an actual method prototype in \c
    903   /// SelectorOrMethod.
    904   ///
    905   /// When non-zero, we have a method declaration; otherwise, we just
    906   /// have a selector.
    907   unsigned HasMethod : 1;
    908 
    909   /// \brief Whether this message send is a "delegate init call",
    910   /// i.e. a call of an init method on self from within an init method.
    911   unsigned IsDelegateInitCall : 1;
    912 
    913   /// \brief Whether this message send was implicitly generated by
    914   /// the implementation rather than explicitly written by the user.
    915   unsigned IsImplicit : 1;
    916 
    917   /// \brief Whether the locations of the selector identifiers are in a
    918   /// "standard" position, a enum SelectorLocationsKind.
    919   unsigned SelLocsKind : 2;
    920 
    921   /// \brief When the message expression is a send to 'super', this is
    922   /// the location of the 'super' keyword.
    923   SourceLocation SuperLoc;
    924 
    925   /// \brief The source locations of the open and close square
    926   /// brackets ('[' and ']', respectively).
    927   SourceLocation LBracLoc, RBracLoc;
    928 
    929   ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs)
    930     : Expr(ObjCMessageExprClass, Empty), SelectorOrMethod(0), Kind(0),
    931       HasMethod(0), IsDelegateInitCall(0), IsImplicit(0), SelLocsKind(0) {
    932     setNumArgs(NumArgs);
    933   }
    934 
    935   ObjCMessageExpr(QualType T, ExprValueKind VK,
    936                   SourceLocation LBracLoc,
    937                   SourceLocation SuperLoc,
    938                   bool IsInstanceSuper,
    939                   QualType SuperType,
    940                   Selector Sel,
    941                   ArrayRef<SourceLocation> SelLocs,
    942                   SelectorLocationsKind SelLocsK,
    943                   ObjCMethodDecl *Method,
    944                   ArrayRef<Expr *> Args,
    945                   SourceLocation RBracLoc,
    946                   bool isImplicit);
    947   ObjCMessageExpr(QualType T, ExprValueKind VK,
    948                   SourceLocation LBracLoc,
    949                   TypeSourceInfo *Receiver,
    950                   Selector Sel,
    951                   ArrayRef<SourceLocation> SelLocs,
    952                   SelectorLocationsKind SelLocsK,
    953                   ObjCMethodDecl *Method,
    954                   ArrayRef<Expr *> Args,
    955                   SourceLocation RBracLoc,
    956                   bool isImplicit);
    957   ObjCMessageExpr(QualType T, ExprValueKind VK,
    958                   SourceLocation LBracLoc,
    959                   Expr *Receiver,
    960                   Selector Sel,
    961                   ArrayRef<SourceLocation> SelLocs,
    962                   SelectorLocationsKind SelLocsK,
    963                   ObjCMethodDecl *Method,
    964                   ArrayRef<Expr *> Args,
    965                   SourceLocation RBracLoc,
    966                   bool isImplicit);
    967 
    968   void initArgsAndSelLocs(ArrayRef<Expr *> Args,
    969                           ArrayRef<SourceLocation> SelLocs,
    970                           SelectorLocationsKind SelLocsK);
    971 
    972   /// \brief Retrieve the pointer value of the message receiver.
    973   void *getReceiverPointer() const {
    974     return *const_cast<void **>(
    975                              reinterpret_cast<const void * const*>(this + 1));
    976   }
    977 
    978   /// \brief Set the pointer value of the message receiver.
    979   void setReceiverPointer(void *Value) {
    980     *reinterpret_cast<void **>(this + 1) = Value;
    981   }
    982 
    983   SelectorLocationsKind getSelLocsKind() const {
    984     return (SelectorLocationsKind)SelLocsKind;
    985   }
    986   bool hasStandardSelLocs() const {
    987     return getSelLocsKind() != SelLoc_NonStandard;
    988   }
    989 
    990   /// \brief Get a pointer to the stored selector identifiers locations array.
    991   /// No locations will be stored if HasStandardSelLocs is true.
    992   SourceLocation *getStoredSelLocs() {
    993     return reinterpret_cast<SourceLocation*>(getArgs() + getNumArgs());
    994   }
    995   const SourceLocation *getStoredSelLocs() const {
    996     return reinterpret_cast<const SourceLocation*>(getArgs() + getNumArgs());
    997   }
    998 
    999   /// \brief Get the number of stored selector identifiers locations.
   1000   /// No locations will be stored if HasStandardSelLocs is true.
   1001   unsigned getNumStoredSelLocs() const {
   1002     if (hasStandardSelLocs())
   1003       return 0;
   1004     return getNumSelectorLocs();
   1005   }
   1006 
   1007   static ObjCMessageExpr *alloc(const ASTContext &C,
   1008                                 ArrayRef<Expr *> Args,
   1009                                 SourceLocation RBraceLoc,
   1010                                 ArrayRef<SourceLocation> SelLocs,
   1011                                 Selector Sel,
   1012                                 SelectorLocationsKind &SelLocsK);
   1013   static ObjCMessageExpr *alloc(const ASTContext &C,
   1014                                 unsigned NumArgs,
   1015                                 unsigned NumStoredSelLocs);
   1016 
   1017 public:
   1018   /// \brief The kind of receiver this message is sending to.
   1019   enum ReceiverKind {
   1020     /// \brief The receiver is a class.
   1021     Class = 0,
   1022     /// \brief The receiver is an object instance.
   1023     Instance,
   1024     /// \brief The receiver is a superclass.
   1025     SuperClass,
   1026     /// \brief The receiver is the instance of the superclass object.
   1027     SuperInstance
   1028   };
   1029 
   1030   /// \brief Create a message send to super.
   1031   ///
   1032   /// \param Context The ASTContext in which this expression will be created.
   1033   ///
   1034   /// \param T The result type of this message.
   1035   ///
   1036   /// \param VK The value kind of this message.  A message returning
   1037   /// a l-value or r-value reference will be an l-value or x-value,
   1038   /// respectively.
   1039   ///
   1040   /// \param LBracLoc The location of the open square bracket '['.
   1041   ///
   1042   /// \param SuperLoc The location of the "super" keyword.
   1043   ///
   1044   /// \param IsInstanceSuper Whether this is an instance "super"
   1045   /// message (otherwise, it's a class "super" message).
   1046   ///
   1047   /// \param Sel The selector used to determine which method gets called.
   1048   ///
   1049   /// \param Method The Objective-C method against which this message
   1050   /// send was type-checked. May be NULL.
   1051   ///
   1052   /// \param Args The message send arguments.
   1053   ///
   1054   /// \param RBracLoc The location of the closing square bracket ']'.
   1055   static ObjCMessageExpr *Create(const ASTContext &Context, QualType T,
   1056                                  ExprValueKind VK,
   1057                                  SourceLocation LBracLoc,
   1058                                  SourceLocation SuperLoc,
   1059                                  bool IsInstanceSuper,
   1060                                  QualType SuperType,
   1061                                  Selector Sel,
   1062                                  ArrayRef<SourceLocation> SelLocs,
   1063                                  ObjCMethodDecl *Method,
   1064                                  ArrayRef<Expr *> Args,
   1065                                  SourceLocation RBracLoc,
   1066                                  bool isImplicit);
   1067 
   1068   /// \brief Create a class message send.
   1069   ///
   1070   /// \param Context The ASTContext in which this expression will be created.
   1071   ///
   1072   /// \param T The result type of this message.
   1073   ///
   1074   /// \param VK The value kind of this message.  A message returning
   1075   /// a l-value or r-value reference will be an l-value or x-value,
   1076   /// respectively.
   1077   ///
   1078   /// \param LBracLoc The location of the open square bracket '['.
   1079   ///
   1080   /// \param Receiver The type of the receiver, including
   1081   /// source-location information.
   1082   ///
   1083   /// \param Sel The selector used to determine which method gets called.
   1084   ///
   1085   /// \param Method The Objective-C method against which this message
   1086   /// send was type-checked. May be NULL.
   1087   ///
   1088   /// \param Args The message send arguments.
   1089   ///
   1090   /// \param RBracLoc The location of the closing square bracket ']'.
   1091   static ObjCMessageExpr *Create(const ASTContext &Context, QualType T,
   1092                                  ExprValueKind VK,
   1093                                  SourceLocation LBracLoc,
   1094                                  TypeSourceInfo *Receiver,
   1095                                  Selector Sel,
   1096                                  ArrayRef<SourceLocation> SelLocs,
   1097                                  ObjCMethodDecl *Method,
   1098                                  ArrayRef<Expr *> Args,
   1099                                  SourceLocation RBracLoc,
   1100                                  bool isImplicit);
   1101 
   1102   /// \brief Create an instance message send.
   1103   ///
   1104   /// \param Context The ASTContext in which this expression will be created.
   1105   ///
   1106   /// \param T The result type of this message.
   1107   ///
   1108   /// \param VK The value kind of this message.  A message returning
   1109   /// a l-value or r-value reference will be an l-value or x-value,
   1110   /// respectively.
   1111   ///
   1112   /// \param LBracLoc The location of the open square bracket '['.
   1113   ///
   1114   /// \param Receiver The expression used to produce the object that
   1115   /// will receive this message.
   1116   ///
   1117   /// \param Sel The selector used to determine which method gets called.
   1118   ///
   1119   /// \param Method The Objective-C method against which this message
   1120   /// send was type-checked. May be NULL.
   1121   ///
   1122   /// \param Args The message send arguments.
   1123   ///
   1124   /// \param RBracLoc The location of the closing square bracket ']'.
   1125   static ObjCMessageExpr *Create(const ASTContext &Context, QualType T,
   1126                                  ExprValueKind VK,
   1127                                  SourceLocation LBracLoc,
   1128                                  Expr *Receiver,
   1129                                  Selector Sel,
   1130                                  ArrayRef<SourceLocation> SeLocs,
   1131                                  ObjCMethodDecl *Method,
   1132                                  ArrayRef<Expr *> Args,
   1133                                  SourceLocation RBracLoc,
   1134                                  bool isImplicit);
   1135 
   1136   /// \brief Create an empty Objective-C message expression, to be
   1137   /// filled in by subsequent calls.
   1138   ///
   1139   /// \param Context The context in which the message send will be created.
   1140   ///
   1141   /// \param NumArgs The number of message arguments, not including
   1142   /// the receiver.
   1143   static ObjCMessageExpr *CreateEmpty(const ASTContext &Context,
   1144                                       unsigned NumArgs,
   1145                                       unsigned NumStoredSelLocs);
   1146 
   1147   /// \brief Indicates whether the message send was implicitly
   1148   /// generated by the implementation. If false, it was written explicitly
   1149   /// in the source code.
   1150   bool isImplicit() const { return IsImplicit; }
   1151 
   1152   /// \brief Determine the kind of receiver that this message is being
   1153   /// sent to.
   1154   ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; }
   1155 
   1156   /// \brief Source range of the receiver.
   1157   SourceRange getReceiverRange() const;
   1158 
   1159   /// \brief Determine whether this is an instance message to either a
   1160   /// computed object or to super.
   1161   bool isInstanceMessage() const {
   1162     return getReceiverKind() == Instance || getReceiverKind() == SuperInstance;
   1163   }
   1164 
   1165   /// \brief Determine whether this is an class message to either a
   1166   /// specified class or to super.
   1167   bool isClassMessage() const {
   1168     return getReceiverKind() == Class || getReceiverKind() == SuperClass;
   1169   }
   1170 
   1171   /// \brief Returns the object expression (receiver) for an instance message,
   1172   /// or null for a message that is not an instance message.
   1173   Expr *getInstanceReceiver() {
   1174     if (getReceiverKind() == Instance)
   1175       return static_cast<Expr *>(getReceiverPointer());
   1176 
   1177     return nullptr;
   1178   }
   1179   const Expr *getInstanceReceiver() const {
   1180     return const_cast<ObjCMessageExpr*>(this)->getInstanceReceiver();
   1181   }
   1182 
   1183   /// \brief Turn this message send into an instance message that
   1184   /// computes the receiver object with the given expression.
   1185   void setInstanceReceiver(Expr *rec) {
   1186     Kind = Instance;
   1187     setReceiverPointer(rec);
   1188   }
   1189 
   1190   /// \brief Returns the type of a class message send, or NULL if the
   1191   /// message is not a class message.
   1192   QualType getClassReceiver() const {
   1193     if (TypeSourceInfo *TSInfo = getClassReceiverTypeInfo())
   1194       return TSInfo->getType();
   1195 
   1196     return QualType();
   1197   }
   1198 
   1199   /// \brief Returns a type-source information of a class message
   1200   /// send, or NULL if the message is not a class message.
   1201   TypeSourceInfo *getClassReceiverTypeInfo() const {
   1202     if (getReceiverKind() == Class)
   1203       return reinterpret_cast<TypeSourceInfo *>(getReceiverPointer());
   1204     return nullptr;
   1205   }
   1206 
   1207   void setClassReceiver(TypeSourceInfo *TSInfo) {
   1208     Kind = Class;
   1209     setReceiverPointer(TSInfo);
   1210   }
   1211 
   1212   /// \brief Retrieve the location of the 'super' keyword for a class
   1213   /// or instance message to 'super', otherwise an invalid source location.
   1214   SourceLocation getSuperLoc() const {
   1215     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
   1216       return SuperLoc;
   1217 
   1218     return SourceLocation();
   1219   }
   1220 
   1221   /// \brief Retrieve the receiver type to which this message is being directed.
   1222   ///
   1223   /// This routine cross-cuts all of the different kinds of message
   1224   /// sends to determine what the underlying (statically known) type
   1225   /// of the receiver will be; use \c getReceiverKind() to determine
   1226   /// whether the message is a class or an instance method, whether it
   1227   /// is a send to super or not, etc.
   1228   ///
   1229   /// \returns The type of the receiver.
   1230   QualType getReceiverType() const;
   1231 
   1232   /// \brief Retrieve the Objective-C interface to which this message
   1233   /// is being directed, if known.
   1234   ///
   1235   /// This routine cross-cuts all of the different kinds of message
   1236   /// sends to determine what the underlying (statically known) type
   1237   /// of the receiver will be; use \c getReceiverKind() to determine
   1238   /// whether the message is a class or an instance method, whether it
   1239   /// is a send to super or not, etc.
   1240   ///
   1241   /// \returns The Objective-C interface if known, otherwise NULL.
   1242   ObjCInterfaceDecl *getReceiverInterface() const;
   1243 
   1244   /// \brief Retrieve the type referred to by 'super'.
   1245   ///
   1246   /// The returned type will either be an ObjCInterfaceType (for an
   1247   /// class message to super) or an ObjCObjectPointerType that refers
   1248   /// to a class (for an instance message to super);
   1249   QualType getSuperType() const {
   1250     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
   1251       return QualType::getFromOpaquePtr(getReceiverPointer());
   1252 
   1253     return QualType();
   1254   }
   1255 
   1256   void setSuper(SourceLocation Loc, QualType T, bool IsInstanceSuper) {
   1257     Kind = IsInstanceSuper? SuperInstance : SuperClass;
   1258     SuperLoc = Loc;
   1259     setReceiverPointer(T.getAsOpaquePtr());
   1260   }
   1261 
   1262   Selector getSelector() const;
   1263 
   1264   void setSelector(Selector S) {
   1265     HasMethod = false;
   1266     SelectorOrMethod = reinterpret_cast<uintptr_t>(S.getAsOpaquePtr());
   1267   }
   1268 
   1269   const ObjCMethodDecl *getMethodDecl() const {
   1270     if (HasMethod)
   1271       return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod);
   1272 
   1273     return nullptr;
   1274   }
   1275 
   1276   ObjCMethodDecl *getMethodDecl() {
   1277     if (HasMethod)
   1278       return reinterpret_cast<ObjCMethodDecl *>(SelectorOrMethod);
   1279 
   1280     return nullptr;
   1281   }
   1282 
   1283   void setMethodDecl(ObjCMethodDecl *MD) {
   1284     HasMethod = true;
   1285     SelectorOrMethod = reinterpret_cast<uintptr_t>(MD);
   1286   }
   1287 
   1288   ObjCMethodFamily getMethodFamily() const {
   1289     if (HasMethod) return getMethodDecl()->getMethodFamily();
   1290     return getSelector().getMethodFamily();
   1291   }
   1292 
   1293   /// \brief Return the number of actual arguments in this message,
   1294   /// not counting the receiver.
   1295   unsigned getNumArgs() const { return NumArgs; }
   1296 
   1297   /// \brief Retrieve the arguments to this message, not including the
   1298   /// receiver.
   1299   Expr **getArgs() {
   1300     return reinterpret_cast<Expr **>(this + 1) + 1;
   1301   }
   1302   const Expr * const *getArgs() const {
   1303     return reinterpret_cast<const Expr * const *>(this + 1) + 1;
   1304   }
   1305 
   1306   /// getArg - Return the specified argument.
   1307   Expr *getArg(unsigned Arg) {
   1308     assert(Arg < NumArgs && "Arg access out of range!");
   1309     return cast<Expr>(getArgs()[Arg]);
   1310   }
   1311   const Expr *getArg(unsigned Arg) const {
   1312     assert(Arg < NumArgs && "Arg access out of range!");
   1313     return cast<Expr>(getArgs()[Arg]);
   1314   }
   1315   /// setArg - Set the specified argument.
   1316   void setArg(unsigned Arg, Expr *ArgExpr) {
   1317     assert(Arg < NumArgs && "Arg access out of range!");
   1318     getArgs()[Arg] = ArgExpr;
   1319   }
   1320 
   1321   /// isDelegateInitCall - Answers whether this message send has been
   1322   /// tagged as a "delegate init call", i.e. a call to a method in the
   1323   /// -init family on self from within an -init method implementation.
   1324   bool isDelegateInitCall() const { return IsDelegateInitCall; }
   1325   void setDelegateInitCall(bool isDelegate) { IsDelegateInitCall = isDelegate; }
   1326 
   1327   SourceLocation getLeftLoc() const { return LBracLoc; }
   1328   SourceLocation getRightLoc() const { return RBracLoc; }
   1329 
   1330   SourceLocation getSelectorStartLoc() const {
   1331     if (isImplicit())
   1332       return getLocStart();
   1333     return getSelectorLoc(0);
   1334   }
   1335   SourceLocation getSelectorLoc(unsigned Index) const {
   1336     assert(Index < getNumSelectorLocs() && "Index out of range!");
   1337     if (hasStandardSelLocs())
   1338       return getStandardSelectorLoc(Index, getSelector(),
   1339                                    getSelLocsKind() == SelLoc_StandardWithSpace,
   1340                                llvm::makeArrayRef(const_cast<Expr**>(getArgs()),
   1341                                                   getNumArgs()),
   1342                                    RBracLoc);
   1343     return getStoredSelLocs()[Index];
   1344   }
   1345 
   1346   void getSelectorLocs(SmallVectorImpl<SourceLocation> &SelLocs) const;
   1347 
   1348   unsigned getNumSelectorLocs() const {
   1349     if (isImplicit())
   1350       return 0;
   1351     Selector Sel = getSelector();
   1352     if (Sel.isUnarySelector())
   1353       return 1;
   1354     return Sel.getNumArgs();
   1355   }
   1356 
   1357   void setSourceRange(SourceRange R) {
   1358     LBracLoc = R.getBegin();
   1359     RBracLoc = R.getEnd();
   1360   }
   1361   SourceLocation getLocStart() const LLVM_READONLY { return LBracLoc; }
   1362   SourceLocation getLocEnd() const LLVM_READONLY { return RBracLoc; }
   1363 
   1364   static bool classof(const Stmt *T) {
   1365     return T->getStmtClass() == ObjCMessageExprClass;
   1366   }
   1367 
   1368   // Iterators
   1369   child_range children();
   1370 
   1371   typedef ExprIterator arg_iterator;
   1372   typedef ConstExprIterator const_arg_iterator;
   1373 
   1374   arg_iterator arg_begin() { return reinterpret_cast<Stmt **>(getArgs()); }
   1375   arg_iterator arg_end()   {
   1376     return reinterpret_cast<Stmt **>(getArgs() + NumArgs);
   1377   }
   1378   const_arg_iterator arg_begin() const {
   1379     return reinterpret_cast<Stmt const * const*>(getArgs());
   1380   }
   1381   const_arg_iterator arg_end() const {
   1382     return reinterpret_cast<Stmt const * const*>(getArgs() + NumArgs);
   1383   }
   1384 
   1385   friend class ASTStmtReader;
   1386   friend class ASTStmtWriter;
   1387 };
   1388 
   1389 /// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
   1390 /// (similar in spirit to MemberExpr).
   1391 class ObjCIsaExpr : public Expr {
   1392   /// Base - the expression for the base object pointer.
   1393   Stmt *Base;
   1394 
   1395   /// IsaMemberLoc - This is the location of the 'isa'.
   1396   SourceLocation IsaMemberLoc;
   1397 
   1398   /// OpLoc - This is the location of '.' or '->'
   1399   SourceLocation OpLoc;
   1400 
   1401   /// IsArrow - True if this is "X->F", false if this is "X.F".
   1402   bool IsArrow;
   1403 public:
   1404   ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, SourceLocation oploc,
   1405               QualType ty)
   1406     : Expr(ObjCIsaExprClass, ty, VK_LValue, OK_Ordinary,
   1407            /*TypeDependent=*/false, base->isValueDependent(),
   1408            base->isInstantiationDependent(),
   1409            /*ContainsUnexpandedParameterPack=*/false),
   1410       Base(base), IsaMemberLoc(l), OpLoc(oploc), IsArrow(isarrow) {}
   1411 
   1412   /// \brief Build an empty expression.
   1413   explicit ObjCIsaExpr(EmptyShell Empty) : Expr(ObjCIsaExprClass, Empty) { }
   1414 
   1415   void setBase(Expr *E) { Base = E; }
   1416   Expr *getBase() const { return cast<Expr>(Base); }
   1417 
   1418   bool isArrow() const { return IsArrow; }
   1419   void setArrow(bool A) { IsArrow = A; }
   1420 
   1421   /// getMemberLoc - Return the location of the "member", in X->F, it is the
   1422   /// location of 'F'.
   1423   SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; }
   1424   void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; }
   1425 
   1426   SourceLocation getOpLoc() const { return OpLoc; }
   1427   void setOpLoc(SourceLocation L) { OpLoc = L; }
   1428 
   1429   SourceLocation getLocStart() const LLVM_READONLY {
   1430     return getBase()->getLocStart();
   1431   }
   1432 
   1433   SourceLocation getBaseLocEnd() const LLVM_READONLY {
   1434     return getBase()->getLocEnd();
   1435   }
   1436 
   1437   SourceLocation getLocEnd() const LLVM_READONLY { return IsaMemberLoc; }
   1438 
   1439   SourceLocation getExprLoc() const LLVM_READONLY { return IsaMemberLoc; }
   1440 
   1441   static bool classof(const Stmt *T) {
   1442     return T->getStmtClass() == ObjCIsaExprClass;
   1443   }
   1444 
   1445   // Iterators
   1446   child_range children() { return child_range(&Base, &Base+1); }
   1447 };
   1448 
   1449 
   1450 /// ObjCIndirectCopyRestoreExpr - Represents the passing of a function
   1451 /// argument by indirect copy-restore in ARC.  This is used to support
   1452 /// passing indirect arguments with the wrong lifetime, e.g. when
   1453 /// passing the address of a __strong local variable to an 'out'
   1454 /// parameter.  This expression kind is only valid in an "argument"
   1455 /// position to some sort of call expression.
   1456 ///
   1457 /// The parameter must have type 'pointer to T', and the argument must
   1458 /// have type 'pointer to U', where T and U agree except possibly in
   1459 /// qualification.  If the argument value is null, then a null pointer
   1460 /// is passed;  otherwise it points to an object A, and:
   1461 /// 1. A temporary object B of type T is initialized, either by
   1462 ///    zero-initialization (used when initializing an 'out' parameter)
   1463 ///    or copy-initialization (used when initializing an 'inout'
   1464 ///    parameter).
   1465 /// 2. The address of the temporary is passed to the function.
   1466 /// 3. If the call completes normally, A is move-assigned from B.
   1467 /// 4. Finally, A is destroyed immediately.
   1468 ///
   1469 /// Currently 'T' must be a retainable object lifetime and must be
   1470 /// __autoreleasing;  this qualifier is ignored when initializing
   1471 /// the value.
   1472 class ObjCIndirectCopyRestoreExpr : public Expr {
   1473   Stmt *Operand;
   1474 
   1475   // unsigned ObjCIndirectCopyRestoreBits.ShouldCopy : 1;
   1476 
   1477   friend class ASTReader;
   1478   friend class ASTStmtReader;
   1479 
   1480   void setShouldCopy(bool shouldCopy) {
   1481     ObjCIndirectCopyRestoreExprBits.ShouldCopy = shouldCopy;
   1482   }
   1483 
   1484   explicit ObjCIndirectCopyRestoreExpr(EmptyShell Empty)
   1485     : Expr(ObjCIndirectCopyRestoreExprClass, Empty) { }
   1486 
   1487 public:
   1488   ObjCIndirectCopyRestoreExpr(Expr *operand, QualType type, bool shouldCopy)
   1489     : Expr(ObjCIndirectCopyRestoreExprClass, type, VK_LValue, OK_Ordinary,
   1490            operand->isTypeDependent(), operand->isValueDependent(),
   1491            operand->isInstantiationDependent(),
   1492            operand->containsUnexpandedParameterPack()),
   1493       Operand(operand) {
   1494     setShouldCopy(shouldCopy);
   1495   }
   1496 
   1497   Expr *getSubExpr() { return cast<Expr>(Operand); }
   1498   const Expr *getSubExpr() const { return cast<Expr>(Operand); }
   1499 
   1500   /// shouldCopy - True if we should do the 'copy' part of the
   1501   /// copy-restore.  If false, the temporary will be zero-initialized.
   1502   bool shouldCopy() const { return ObjCIndirectCopyRestoreExprBits.ShouldCopy; }
   1503 
   1504   child_range children() { return child_range(&Operand, &Operand+1); }
   1505 
   1506   // Source locations are determined by the subexpression.
   1507   SourceLocation getLocStart() const LLVM_READONLY {
   1508     return Operand->getLocStart();
   1509   }
   1510   SourceLocation getLocEnd() const LLVM_READONLY { return Operand->getLocEnd();}
   1511 
   1512   SourceLocation getExprLoc() const LLVM_READONLY {
   1513     return getSubExpr()->getExprLoc();
   1514   }
   1515 
   1516   static bool classof(const Stmt *s) {
   1517     return s->getStmtClass() == ObjCIndirectCopyRestoreExprClass;
   1518   }
   1519 };
   1520 
   1521 /// \brief An Objective-C "bridged" cast expression, which casts between
   1522 /// Objective-C pointers and C pointers, transferring ownership in the process.
   1523 ///
   1524 /// \code
   1525 /// NSString *str = (__bridge_transfer NSString *)CFCreateString();
   1526 /// \endcode
   1527 class ObjCBridgedCastExpr : public ExplicitCastExpr {
   1528   SourceLocation LParenLoc;
   1529   SourceLocation BridgeKeywordLoc;
   1530   unsigned Kind : 2;
   1531 
   1532   friend class ASTStmtReader;
   1533   friend class ASTStmtWriter;
   1534 
   1535 public:
   1536   ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind,
   1537                       CastKind CK, SourceLocation BridgeKeywordLoc,
   1538                       TypeSourceInfo *TSInfo, Expr *Operand)
   1539     : ExplicitCastExpr(ObjCBridgedCastExprClass, TSInfo->getType(), VK_RValue,
   1540                        CK, Operand, 0, TSInfo),
   1541       LParenLoc(LParenLoc), BridgeKeywordLoc(BridgeKeywordLoc), Kind(Kind) { }
   1542 
   1543   /// \brief Construct an empty Objective-C bridged cast.
   1544   explicit ObjCBridgedCastExpr(EmptyShell Shell)
   1545     : ExplicitCastExpr(ObjCBridgedCastExprClass, Shell, 0) { }
   1546 
   1547   SourceLocation getLParenLoc() const { return LParenLoc; }
   1548 
   1549   /// \brief Determine which kind of bridge is being performed via this cast.
   1550   ObjCBridgeCastKind getBridgeKind() const {
   1551     return static_cast<ObjCBridgeCastKind>(Kind);
   1552   }
   1553 
   1554   /// \brief Retrieve the kind of bridge being performed as a string.
   1555   StringRef getBridgeKindName() const;
   1556 
   1557   /// \brief The location of the bridge keyword.
   1558   SourceLocation getBridgeKeywordLoc() const { return BridgeKeywordLoc; }
   1559 
   1560   SourceLocation getLocStart() const LLVM_READONLY { return LParenLoc; }
   1561   SourceLocation getLocEnd() const LLVM_READONLY {
   1562     return getSubExpr()->getLocEnd();
   1563   }
   1564 
   1565   static bool classof(const Stmt *T) {
   1566     return T->getStmtClass() == ObjCBridgedCastExprClass;
   1567   }
   1568 };
   1569 
   1570 }  // end namespace clang
   1571 
   1572 #endif
   1573