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