]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/include/clang/AST/ExprObjC.h
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.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
22 namespace clang {
23   class IdentifierInfo;
24   class ASTContext;
25
26 /// ObjCStringLiteral, used for Objective-C string literals
27 /// i.e. @"foo".
28 class ObjCStringLiteral : public Expr {
29   Stmt *String;
30   SourceLocation AtLoc;
31 public:
32   ObjCStringLiteral(StringLiteral *SL, QualType T, SourceLocation L)
33     : Expr(ObjCStringLiteralClass, T, VK_RValue, OK_Ordinary, false, false,
34            false, false),
35       String(SL), AtLoc(L) {}
36   explicit ObjCStringLiteral(EmptyShell Empty)
37     : Expr(ObjCStringLiteralClass, Empty) {}
38
39   StringLiteral *getString() { return cast<StringLiteral>(String); }
40   const StringLiteral *getString() const { return cast<StringLiteral>(String); }
41   void setString(StringLiteral *S) { String = S; }
42
43   SourceLocation getAtLoc() const { return AtLoc; }
44   void setAtLoc(SourceLocation L) { AtLoc = L; }
45
46   SourceRange getSourceRange() const {
47     return SourceRange(AtLoc, String->getLocEnd());
48   }
49
50   static bool classof(const Stmt *T) {
51     return T->getStmtClass() == ObjCStringLiteralClass;
52   }
53   static bool classof(const ObjCStringLiteral *) { return true; }
54
55   // Iterators
56   child_range children() { return child_range(&String, &String+1); }
57 };
58
59 /// ObjCEncodeExpr, used for @encode in Objective-C.  @encode has the same type
60 /// and behavior as StringLiteral except that the string initializer is obtained
61 /// from ASTContext with the encoding type as an argument.
62 class ObjCEncodeExpr : public Expr {
63   TypeSourceInfo *EncodedType;
64   SourceLocation AtLoc, RParenLoc;
65 public:
66   ObjCEncodeExpr(QualType T, TypeSourceInfo *EncodedType,
67                  SourceLocation at, SourceLocation rp)
68     : Expr(ObjCEncodeExprClass, T, VK_LValue, OK_Ordinary,
69            EncodedType->getType()->isDependentType(),
70            EncodedType->getType()->isDependentType(),
71            EncodedType->getType()->isInstantiationDependentType(),
72            EncodedType->getType()->containsUnexpandedParameterPack()), 
73       EncodedType(EncodedType), AtLoc(at), RParenLoc(rp) {}
74
75   explicit ObjCEncodeExpr(EmptyShell Empty) : Expr(ObjCEncodeExprClass, Empty){}
76
77
78   SourceLocation getAtLoc() const { return AtLoc; }
79   void setAtLoc(SourceLocation L) { AtLoc = L; }
80   SourceLocation getRParenLoc() const { return RParenLoc; }
81   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
82
83   QualType getEncodedType() const { return EncodedType->getType(); }
84
85   TypeSourceInfo *getEncodedTypeSourceInfo() const { return EncodedType; }
86   void setEncodedTypeSourceInfo(TypeSourceInfo *EncType) { 
87     EncodedType = EncType; 
88   }
89
90   SourceRange getSourceRange() const {
91     return SourceRange(AtLoc, RParenLoc);
92   }
93
94   static bool classof(const Stmt *T) {
95     return T->getStmtClass() == ObjCEncodeExprClass;
96   }
97   static bool classof(const ObjCEncodeExpr *) { return true; }
98
99   // Iterators
100   child_range children() { return child_range(); }
101 };
102
103 /// ObjCSelectorExpr used for @selector in Objective-C.
104 class ObjCSelectorExpr : public Expr {
105   Selector SelName;
106   SourceLocation AtLoc, RParenLoc;
107 public:
108   ObjCSelectorExpr(QualType T, Selector selInfo,
109                    SourceLocation at, SourceLocation rp)
110     : Expr(ObjCSelectorExprClass, T, VK_RValue, OK_Ordinary, false, false, 
111            false, false),
112     SelName(selInfo), AtLoc(at), RParenLoc(rp){}
113   explicit ObjCSelectorExpr(EmptyShell Empty)
114    : Expr(ObjCSelectorExprClass, Empty) {}
115
116   Selector getSelector() const { return SelName; }
117   void setSelector(Selector S) { SelName = S; }
118
119   SourceLocation getAtLoc() const { return AtLoc; }
120   SourceLocation getRParenLoc() const { return RParenLoc; }
121   void setAtLoc(SourceLocation L) { AtLoc = L; }
122   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
123
124   SourceRange getSourceRange() const {
125     return SourceRange(AtLoc, RParenLoc);
126   }
127
128   /// getNumArgs - Return the number of actual arguments to this call.
129   unsigned getNumArgs() const { return SelName.getNumArgs(); }
130
131   static bool classof(const Stmt *T) {
132     return T->getStmtClass() == ObjCSelectorExprClass;
133   }
134   static bool classof(const ObjCSelectorExpr *) { return true; }
135
136   // Iterators
137   child_range children() { return child_range(); }
138 };
139
140 /// ObjCProtocolExpr used for protocol expression in Objective-C.  This is used
141 /// as: @protocol(foo), as in:
142 ///   obj conformsToProtocol:@protocol(foo)]
143 /// The return type is "Protocol*".
144 class ObjCProtocolExpr : public Expr {
145   ObjCProtocolDecl *TheProtocol;
146   SourceLocation AtLoc, RParenLoc;
147 public:
148   ObjCProtocolExpr(QualType T, ObjCProtocolDecl *protocol,
149                    SourceLocation at, SourceLocation rp)
150     : Expr(ObjCProtocolExprClass, T, VK_RValue, OK_Ordinary, false, false,
151            false, false),
152       TheProtocol(protocol), AtLoc(at), RParenLoc(rp) {}
153   explicit ObjCProtocolExpr(EmptyShell Empty)
154     : Expr(ObjCProtocolExprClass, Empty) {}
155
156   ObjCProtocolDecl *getProtocol() const { return TheProtocol; }
157   void setProtocol(ObjCProtocolDecl *P) { TheProtocol = P; }
158
159   SourceLocation getAtLoc() const { return AtLoc; }
160   SourceLocation getRParenLoc() const { return RParenLoc; }
161   void setAtLoc(SourceLocation L) { AtLoc = L; }
162   void setRParenLoc(SourceLocation L) { RParenLoc = L; }
163
164   SourceRange getSourceRange() const {
165     return SourceRange(AtLoc, RParenLoc);
166   }
167
168   static bool classof(const Stmt *T) {
169     return T->getStmtClass() == ObjCProtocolExprClass;
170   }
171   static bool classof(const ObjCProtocolExpr *) { return true; }
172
173   // Iterators
174   child_range children() { return child_range(); }
175 };
176
177 /// ObjCIvarRefExpr - A reference to an ObjC instance variable.
178 class ObjCIvarRefExpr : public Expr {
179   class ObjCIvarDecl *D;
180   SourceLocation Loc;
181   Stmt *Base;
182   bool IsArrow:1;      // True if this is "X->F", false if this is "X.F".
183   bool IsFreeIvar:1;   // True if ivar reference has no base (self assumed).
184
185 public:
186   ObjCIvarRefExpr(ObjCIvarDecl *d, QualType t,
187                   SourceLocation l, Expr *base,
188                   bool arrow = false, bool freeIvar = false) :
189     Expr(ObjCIvarRefExprClass, t, VK_LValue, OK_Ordinary,
190          /*TypeDependent=*/false, base->isValueDependent(), 
191          base->isInstantiationDependent(),
192          base->containsUnexpandedParameterPack()), 
193     D(d), Loc(l), Base(base), IsArrow(arrow), IsFreeIvar(freeIvar) {}
194
195   explicit ObjCIvarRefExpr(EmptyShell Empty)
196     : Expr(ObjCIvarRefExprClass, Empty) {}
197
198   ObjCIvarDecl *getDecl() { return D; }
199   const ObjCIvarDecl *getDecl() const { return D; }
200   void setDecl(ObjCIvarDecl *d) { D = d; }
201
202   const Expr *getBase() const { return cast<Expr>(Base); }
203   Expr *getBase() { return cast<Expr>(Base); }
204   void setBase(Expr * base) { Base = base; }
205
206   bool isArrow() const { return IsArrow; }
207   bool isFreeIvar() const { return IsFreeIvar; }
208   void setIsArrow(bool A) { IsArrow = A; }
209   void setIsFreeIvar(bool A) { IsFreeIvar = A; }
210
211   SourceLocation getLocation() const { return Loc; }
212   void setLocation(SourceLocation L) { Loc = L; }
213
214   SourceRange getSourceRange() const {
215     return isFreeIvar() ? SourceRange(Loc)
216     : SourceRange(getBase()->getLocStart(), Loc);
217   }
218
219   static bool classof(const Stmt *T) {
220     return T->getStmtClass() == ObjCIvarRefExprClass;
221   }
222   static bool classof(const ObjCIvarRefExpr *) { return true; }
223
224   // Iterators
225   child_range children() { return child_range(&Base, &Base+1); }
226 };
227
228 /// ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC
229 /// property.
230 ///
231 class ObjCPropertyRefExpr : public Expr {
232 private:
233   /// If the bool is true, this is an implicit property reference; the
234   /// pointer is an (optional) ObjCMethodDecl and Setter may be set.
235   /// if the bool is false, this is an explicit property reference;
236   /// the pointer is an ObjCPropertyDecl and Setter is always null.
237   llvm::PointerIntPair<NamedDecl*, 1, bool> PropertyOrGetter;
238   ObjCMethodDecl *Setter;
239
240   SourceLocation IdLoc;
241   
242   /// \brief When the receiver in property access is 'super', this is
243   /// the location of the 'super' keyword.  When it's an interface,
244   /// this is that interface.
245   SourceLocation ReceiverLoc;
246   llvm::PointerUnion3<Stmt*, const Type*, ObjCInterfaceDecl*> Receiver;
247   
248 public:
249   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
250                       ExprValueKind VK, ExprObjectKind OK,
251                       SourceLocation l, Expr *base)
252     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
253            /*TypeDependent=*/false, base->isValueDependent(),
254            base->isInstantiationDependent(),
255            base->containsUnexpandedParameterPack()),
256       PropertyOrGetter(PD, false), Setter(0),
257       IdLoc(l), ReceiverLoc(), Receiver(base) {
258   }
259   
260   ObjCPropertyRefExpr(ObjCPropertyDecl *PD, QualType t,
261                       ExprValueKind VK, ExprObjectKind OK,
262                       SourceLocation l, SourceLocation sl, QualType st)
263     : Expr(ObjCPropertyRefExprClass, t, VK, OK,
264            /*TypeDependent=*/false, false, st->isInstantiationDependentType(),
265            st->containsUnexpandedParameterPack()),
266       PropertyOrGetter(PD, false), Setter(0),
267       IdLoc(l), ReceiverLoc(sl), Receiver(st.getTypePtr()) {
268   }
269
270   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
271                       QualType T, ExprValueKind VK, ExprObjectKind OK,
272                       SourceLocation IdLoc, Expr *Base)
273     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false,
274            Base->isValueDependent(), Base->isInstantiationDependent(),
275            Base->containsUnexpandedParameterPack()),
276       PropertyOrGetter(Getter, true), Setter(Setter),
277       IdLoc(IdLoc), ReceiverLoc(), Receiver(Base) {
278   }
279
280   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
281                       QualType T, ExprValueKind VK, ExprObjectKind OK,
282                       SourceLocation IdLoc,
283                       SourceLocation SuperLoc, QualType SuperTy)
284     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
285       PropertyOrGetter(Getter, true), Setter(Setter),
286       IdLoc(IdLoc), ReceiverLoc(SuperLoc), Receiver(SuperTy.getTypePtr()) {
287   }
288
289   ObjCPropertyRefExpr(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter,
290                       QualType T, ExprValueKind VK, ExprObjectKind OK,
291                       SourceLocation IdLoc,
292                       SourceLocation ReceiverLoc, ObjCInterfaceDecl *Receiver)
293     : Expr(ObjCPropertyRefExprClass, T, VK, OK, false, false, false, false),
294       PropertyOrGetter(Getter, true), Setter(Setter),
295       IdLoc(IdLoc), ReceiverLoc(ReceiverLoc), Receiver(Receiver) {
296   }
297
298   explicit ObjCPropertyRefExpr(EmptyShell Empty)
299     : Expr(ObjCPropertyRefExprClass, Empty) {}
300
301   bool isImplicitProperty() const { return PropertyOrGetter.getInt(); }
302   bool isExplicitProperty() const { return !PropertyOrGetter.getInt(); }
303
304   ObjCPropertyDecl *getExplicitProperty() const {
305     assert(!isImplicitProperty());
306     return cast<ObjCPropertyDecl>(PropertyOrGetter.getPointer());
307   }
308
309   ObjCMethodDecl *getImplicitPropertyGetter() const {
310     assert(isImplicitProperty());
311     return cast_or_null<ObjCMethodDecl>(PropertyOrGetter.getPointer());
312   }
313
314   ObjCMethodDecl *getImplicitPropertySetter() const {
315     assert(isImplicitProperty());
316     return Setter;
317   }
318
319   Selector getGetterSelector() const {
320     if (isImplicitProperty())
321       return getImplicitPropertyGetter()->getSelector();
322     return getExplicitProperty()->getGetterName();
323   }
324
325   Selector getSetterSelector() const {
326     if (isImplicitProperty())
327       return getImplicitPropertySetter()->getSelector();
328     return getExplicitProperty()->getSetterName();
329   }
330
331   const Expr *getBase() const { 
332     return cast<Expr>(Receiver.get<Stmt*>()); 
333   }
334   Expr *getBase() { 
335     return cast<Expr>(Receiver.get<Stmt*>()); 
336   }
337
338   SourceLocation getLocation() const { return IdLoc; }
339   
340   SourceLocation getReceiverLocation() const { return ReceiverLoc; }
341   QualType getSuperReceiverType() const { 
342     return QualType(Receiver.get<const Type*>(), 0); 
343   }
344   QualType getGetterResultType() const {
345     QualType ResultType;
346     if (isExplicitProperty()) {
347       const ObjCPropertyDecl *PDecl = getExplicitProperty();
348       if (const ObjCMethodDecl *Getter = PDecl->getGetterMethodDecl())
349         ResultType = Getter->getResultType();
350       else
351         ResultType = getType();
352     } else {
353       const ObjCMethodDecl *Getter = getImplicitPropertyGetter();
354       ResultType = Getter->getResultType(); // with reference!
355     }
356     return ResultType;
357   }
358   
359   QualType getSetterArgType() const {
360     QualType ArgType;
361     if (isImplicitProperty()) {
362       const ObjCMethodDecl *Setter = getImplicitPropertySetter();
363       ObjCMethodDecl::param_const_iterator P = Setter->param_begin(); 
364       ArgType = (*P)->getType();
365     } else {
366       if (ObjCPropertyDecl *PDecl = getExplicitProperty())
367         if (const ObjCMethodDecl *Setter = PDecl->getSetterMethodDecl()) {
368           ObjCMethodDecl::param_const_iterator P = Setter->param_begin(); 
369           ArgType = (*P)->getType();
370         }
371       if (ArgType.isNull())
372         ArgType = getType();
373     }
374     return ArgType;
375   }
376   
377   ObjCInterfaceDecl *getClassReceiver() const {
378     return Receiver.get<ObjCInterfaceDecl*>();
379   }
380   bool isObjectReceiver() const { return Receiver.is<Stmt*>(); }
381   bool isSuperReceiver() const { return Receiver.is<const Type*>(); }
382   bool isClassReceiver() const { return Receiver.is<ObjCInterfaceDecl*>(); }
383
384   SourceRange getSourceRange() const {
385     return SourceRange((isObjectReceiver() ? getBase()->getLocStart()
386                                            : getReceiverLocation()), 
387                        IdLoc);
388   }
389
390   static bool classof(const Stmt *T) {
391     return T->getStmtClass() == ObjCPropertyRefExprClass;
392   }
393   static bool classof(const ObjCPropertyRefExpr *) { return true; }
394
395   // Iterators
396   child_range children() {
397     if (Receiver.is<Stmt*>()) {
398       Stmt **begin = reinterpret_cast<Stmt**>(&Receiver); // hack!
399       return child_range(begin, begin+1);
400     }
401     return child_range();
402   }
403
404 private:
405   friend class ASTStmtReader;
406   void setExplicitProperty(ObjCPropertyDecl *D) {
407     PropertyOrGetter.setPointer(D);
408     PropertyOrGetter.setInt(false);
409     Setter = 0;
410   }
411   void setImplicitProperty(ObjCMethodDecl *Getter, ObjCMethodDecl *Setter) {
412     PropertyOrGetter.setPointer(Getter);
413     PropertyOrGetter.setInt(true);
414     this->Setter = Setter;
415   }
416   void setBase(Expr *Base) { Receiver = Base; }
417   void setSuperReceiver(QualType T) { Receiver = T.getTypePtr(); }
418   void setClassReceiver(ObjCInterfaceDecl *D) { Receiver = D; }
419
420   void setLocation(SourceLocation L) { IdLoc = L; }
421   void setReceiverLocation(SourceLocation Loc) { ReceiverLoc = Loc; }
422 };
423
424 /// \brief An expression that sends a message to the given Objective-C
425 /// object or class.
426 ///
427 /// The following contains two message send expressions:
428 ///
429 /// \code
430 ///   [[NSString alloc] initWithString:@"Hello"]
431 /// \endcode
432 ///
433 /// The innermost message send invokes the "alloc" class method on the
434 /// NSString class, while the outermost message send invokes the
435 /// "initWithString" instance method on the object returned from
436 /// NSString's "alloc". In all, an Objective-C message send can take
437 /// on four different (although related) forms:
438 ///
439 ///   1. Send to an object instance.
440 ///   2. Send to a class.
441 ///   3. Send to the superclass instance of the current class.
442 ///   4. Send to the superclass of the current class.
443 ///
444 /// All four kinds of message sends are modeled by the ObjCMessageExpr
445 /// class, and can be distinguished via \c getReceiverKind(). Example:
446 ///
447 class ObjCMessageExpr : public Expr {
448   /// \brief Stores either the selector that this message is sending
449   /// to (when \c HasMethod is zero) or an \c ObjCMethodDecl pointer
450   /// referring to the method that we type-checked against.
451   uintptr_t SelectorOrMethod;
452
453   enum { NumArgsBitWidth = 16 };
454
455   /// \brief The number of arguments in the message send, not
456   /// including the receiver.
457   unsigned NumArgs : NumArgsBitWidth;
458   
459   void setNumArgs(unsigned Num) {
460     assert((Num >> NumArgsBitWidth) == 0 && "Num of args is out of range!");
461     NumArgs = Num;
462   }
463
464   /// \brief The kind of message send this is, which is one of the
465   /// ReceiverKind values.
466   ///
467   /// We pad this out to a byte to avoid excessive masking and shifting.
468   unsigned Kind : 8;
469
470   /// \brief Whether we have an actual method prototype in \c
471   /// SelectorOrMethod.
472   ///
473   /// When non-zero, we have a method declaration; otherwise, we just
474   /// have a selector.
475   unsigned HasMethod : 1;
476
477   /// \brief Whether this message send is a "delegate init call",
478   /// i.e. a call of an init method on self from within an init method.
479   unsigned IsDelegateInitCall : 1;
480   
481   /// \brief Whether the locations of the selector identifiers are in a
482   /// "standard" position, a enum SelectorLocationsKind.
483   unsigned SelLocsKind : 2;
484
485   /// \brief When the message expression is a send to 'super', this is
486   /// the location of the 'super' keyword.
487   SourceLocation SuperLoc;
488
489   /// \brief The source locations of the open and close square
490   /// brackets ('[' and ']', respectively).
491   SourceLocation LBracLoc, RBracLoc;
492
493   ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs)
494     : Expr(ObjCMessageExprClass, Empty), SelectorOrMethod(0), Kind(0), 
495       HasMethod(0), IsDelegateInitCall(0) {
496     setNumArgs(NumArgs);
497   }
498
499   ObjCMessageExpr(QualType T, ExprValueKind VK,
500                   SourceLocation LBracLoc,
501                   SourceLocation SuperLoc,
502                   bool IsInstanceSuper,
503                   QualType SuperType,
504                   Selector Sel, 
505                   ArrayRef<SourceLocation> SelLocs,
506                   SelectorLocationsKind SelLocsK,
507                   ObjCMethodDecl *Method,
508                   ArrayRef<Expr *> Args,
509                   SourceLocation RBracLoc);
510   ObjCMessageExpr(QualType T, ExprValueKind VK,
511                   SourceLocation LBracLoc,
512                   TypeSourceInfo *Receiver,
513                   Selector Sel, 
514                   ArrayRef<SourceLocation> SelLocs,
515                   SelectorLocationsKind SelLocsK,
516                   ObjCMethodDecl *Method,
517                   ArrayRef<Expr *> Args,
518                   SourceLocation RBracLoc);
519   ObjCMessageExpr(QualType T, ExprValueKind VK,
520                   SourceLocation LBracLoc,
521                   Expr *Receiver,
522                   Selector Sel, 
523                   ArrayRef<SourceLocation> SelLocs,
524                   SelectorLocationsKind SelLocsK,
525                   ObjCMethodDecl *Method,
526                   ArrayRef<Expr *> Args,
527                   SourceLocation RBracLoc);
528
529   void initArgsAndSelLocs(ArrayRef<Expr *> Args,
530                           ArrayRef<SourceLocation> SelLocs,
531                           SelectorLocationsKind SelLocsK);
532
533   /// \brief Retrieve the pointer value of the message receiver.
534   void *getReceiverPointer() const {
535     return *const_cast<void **>(
536                              reinterpret_cast<const void * const*>(this + 1));
537   }
538
539   /// \brief Set the pointer value of the message receiver.
540   void setReceiverPointer(void *Value) {
541     *reinterpret_cast<void **>(this + 1) = Value;
542   }
543
544   SelectorLocationsKind getSelLocsKind() const {
545     return (SelectorLocationsKind)SelLocsKind;
546   }
547   bool hasStandardSelLocs() const {
548     return getSelLocsKind() != SelLoc_NonStandard;
549   }
550
551   /// \brief Get a pointer to the stored selector identifiers locations array.
552   /// No locations will be stored if HasStandardSelLocs is true.
553   SourceLocation *getStoredSelLocs() {
554     return reinterpret_cast<SourceLocation*>(getArgs() + getNumArgs());
555   }
556   const SourceLocation *getStoredSelLocs() const {
557     return reinterpret_cast<const SourceLocation*>(getArgs() + getNumArgs());
558   }
559
560   /// \brief Get the number of stored selector identifiers locations.
561   /// No locations will be stored if HasStandardSelLocs is true.
562   unsigned getNumStoredSelLocs() const {
563     if (hasStandardSelLocs())
564       return 0;
565     return getNumSelectorLocs();
566   }
567
568   static ObjCMessageExpr *alloc(ASTContext &C,
569                                 ArrayRef<Expr *> Args,
570                                 SourceLocation RBraceLoc,
571                                 ArrayRef<SourceLocation> SelLocs,
572                                 Selector Sel,
573                                 SelectorLocationsKind &SelLocsK);
574   static ObjCMessageExpr *alloc(ASTContext &C,
575                                 unsigned NumArgs,
576                                 unsigned NumStoredSelLocs);
577
578 public:
579   /// \brief The kind of receiver this message is sending to.
580   enum ReceiverKind {
581     /// \brief The receiver is a class.
582     Class = 0,
583     /// \brief The receiver is an object instance.
584     Instance,
585     /// \brief The receiver is a superclass.
586     SuperClass,
587     /// \brief The receiver is the instance of the superclass object.
588     SuperInstance
589   };
590
591   /// \brief Create a message send to super.
592   ///
593   /// \param Context The ASTContext in which this expression will be created.
594   ///
595   /// \param T The result type of this message.
596   ///
597   /// \param VK The value kind of this message.  A message returning
598   /// a l-value or r-value reference will be an l-value or x-value,
599   /// respectively.
600   ///
601   /// \param LBrac The location of the open square bracket '['.
602   ///
603   /// \param SuperLoc The location of the "super" keyword.
604   ///
605   /// \param IsInstanceSuper Whether this is an instance "super"
606   /// message (otherwise, it's a class "super" message).
607   ///
608   /// \param Sel The selector used to determine which method gets called.
609   ///
610   /// \param Method The Objective-C method against which this message
611   /// send was type-checked. May be NULL.
612   ///
613   /// \param Args The message send arguments.
614   ///
615   /// \param NumArgs The number of arguments.
616   ///
617   /// \param RBracLoc The location of the closing square bracket ']'.
618   static ObjCMessageExpr *Create(ASTContext &Context, QualType T, 
619                                  ExprValueKind VK,
620                                  SourceLocation LBracLoc,
621                                  SourceLocation SuperLoc,
622                                  bool IsInstanceSuper,
623                                  QualType SuperType,
624                                  Selector Sel, 
625                                  ArrayRef<SourceLocation> SelLocs,
626                                  ObjCMethodDecl *Method,
627                                  ArrayRef<Expr *> Args,
628                                  SourceLocation RBracLoc);
629
630   /// \brief Create a class message send.
631   ///
632   /// \param Context The ASTContext in which this expression will be created.
633   ///
634   /// \param T The result type of this message.
635   ///
636   /// \param VK The value kind of this message.  A message returning
637   /// a l-value or r-value reference will be an l-value or x-value,
638   /// respectively.
639   ///
640   /// \param LBrac The location of the open square bracket '['.
641   ///
642   /// \param Receiver The type of the receiver, including
643   /// source-location information.
644   ///
645   /// \param Sel The selector used to determine which method gets called.
646   ///
647   /// \param Method The Objective-C method against which this message
648   /// send was type-checked. May be NULL.
649   ///
650   /// \param Args The message send arguments.
651   ///
652   /// \param NumArgs The number of arguments.
653   ///
654   /// \param RBracLoc The location of the closing square bracket ']'.
655   static ObjCMessageExpr *Create(ASTContext &Context, QualType T,
656                                  ExprValueKind VK,
657                                  SourceLocation LBracLoc,
658                                  TypeSourceInfo *Receiver,
659                                  Selector Sel, 
660                                  ArrayRef<SourceLocation> SelLocs,
661                                  ObjCMethodDecl *Method,
662                                  ArrayRef<Expr *> Args,
663                                  SourceLocation RBracLoc);
664
665   /// \brief Create an instance message send.
666   ///
667   /// \param Context The ASTContext in which this expression will be created.
668   ///
669   /// \param T The result type of this message.
670   ///
671   /// \param VK The value kind of this message.  A message returning
672   /// a l-value or r-value reference will be an l-value or x-value,
673   /// respectively.
674   ///
675   /// \param LBrac The location of the open square bracket '['.
676   ///
677   /// \param Receiver The expression used to produce the object that
678   /// will receive this message.
679   ///
680   /// \param Sel The selector used to determine which method gets called.
681   ///
682   /// \param Method The Objective-C method against which this message
683   /// send was type-checked. May be NULL.
684   ///
685   /// \param Args The message send arguments.
686   ///
687   /// \param NumArgs The number of arguments.
688   ///
689   /// \param RBracLoc The location of the closing square bracket ']'.
690   static ObjCMessageExpr *Create(ASTContext &Context, QualType T,
691                                  ExprValueKind VK,
692                                  SourceLocation LBracLoc,
693                                  Expr *Receiver,
694                                  Selector Sel, 
695                                  ArrayRef<SourceLocation> SeLocs,
696                                  ObjCMethodDecl *Method,
697                                  ArrayRef<Expr *> Args,
698                                  SourceLocation RBracLoc);
699
700   /// \brief Create an empty Objective-C message expression, to be
701   /// filled in by subsequent calls.
702   ///
703   /// \param Context The context in which the message send will be created.
704   ///
705   /// \param NumArgs The number of message arguments, not including
706   /// the receiver.
707   static ObjCMessageExpr *CreateEmpty(ASTContext &Context,
708                                       unsigned NumArgs,
709                                       unsigned NumStoredSelLocs);
710
711   /// \brief Determine the kind of receiver that this message is being
712   /// sent to.
713   ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; }
714
715   /// \brief Source range of the receiver.
716   SourceRange getReceiverRange() const;
717
718   /// \brief Determine whether this is an instance message to either a
719   /// computed object or to super.
720   bool isInstanceMessage() const {
721     return getReceiverKind() == Instance || getReceiverKind() == SuperInstance;
722   }
723
724   /// \brief Determine whether this is an class message to either a
725   /// specified class or to super.
726   bool isClassMessage() const {
727     return getReceiverKind() == Class || getReceiverKind() == SuperClass;
728   }
729
730   /// \brief Returns the receiver of an instance message.
731   ///
732   /// \brief Returns the object expression for an instance message, or
733   /// NULL for a message that is not an instance message.
734   Expr *getInstanceReceiver() {
735     if (getReceiverKind() == Instance)
736       return static_cast<Expr *>(getReceiverPointer());
737
738     return 0;
739   }
740   const Expr *getInstanceReceiver() const {
741     return const_cast<ObjCMessageExpr*>(this)->getInstanceReceiver();
742   }
743
744   /// \brief Turn this message send into an instance message that
745   /// computes the receiver object with the given expression.
746   void setInstanceReceiver(Expr *rec) { 
747     Kind = Instance;
748     setReceiverPointer(rec);
749   }
750   
751   /// \brief Returns the type of a class message send, or NULL if the
752   /// message is not a class message.
753   QualType getClassReceiver() const { 
754     if (TypeSourceInfo *TSInfo = getClassReceiverTypeInfo())
755       return TSInfo->getType();
756
757     return QualType();
758   }
759
760   /// \brief Returns a type-source information of a class message
761   /// send, or NULL if the message is not a class message.
762   TypeSourceInfo *getClassReceiverTypeInfo() const {
763     if (getReceiverKind() == Class)
764       return reinterpret_cast<TypeSourceInfo *>(getReceiverPointer());
765     return 0;
766   }
767
768   void setClassReceiver(TypeSourceInfo *TSInfo) {
769     Kind = Class;
770     setReceiverPointer(TSInfo);
771   }
772
773   /// \brief Retrieve the location of the 'super' keyword for a class
774   /// or instance message to 'super', otherwise an invalid source location.
775   SourceLocation getSuperLoc() const { 
776     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
777       return SuperLoc;
778
779     return SourceLocation();
780   }
781
782   /// \brief Retrieve the Objective-C interface to which this message
783   /// is being directed, if known.
784   ///
785   /// This routine cross-cuts all of the different kinds of message
786   /// sends to determine what the underlying (statically known) type
787   /// of the receiver will be; use \c getReceiverKind() to determine
788   /// whether the message is a class or an instance method, whether it
789   /// is a send to super or not, etc.
790   ///
791   /// \returns The Objective-C interface if known, otherwise NULL.
792   ObjCInterfaceDecl *getReceiverInterface() const;
793
794   /// \brief Retrieve the type referred to by 'super'. 
795   ///
796   /// The returned type will either be an ObjCInterfaceType (for an
797   /// class message to super) or an ObjCObjectPointerType that refers
798   /// to a class (for an instance message to super);
799   QualType getSuperType() const {
800     if (getReceiverKind() == SuperInstance || getReceiverKind() == SuperClass)
801       return QualType::getFromOpaquePtr(getReceiverPointer());
802
803     return QualType();
804   }
805
806   void setSuper(SourceLocation Loc, QualType T, bool IsInstanceSuper) {
807     Kind = IsInstanceSuper? SuperInstance : SuperClass;
808     SuperLoc = Loc;
809     setReceiverPointer(T.getAsOpaquePtr());
810   }
811
812   Selector getSelector() const;
813
814   void setSelector(Selector S) { 
815     HasMethod = false;
816     SelectorOrMethod = reinterpret_cast<uintptr_t>(S.getAsOpaquePtr());
817   }
818
819   const ObjCMethodDecl *getMethodDecl() const { 
820     if (HasMethod)
821       return reinterpret_cast<const ObjCMethodDecl *>(SelectorOrMethod);
822
823     return 0;
824   }
825
826   ObjCMethodDecl *getMethodDecl() { 
827     if (HasMethod)
828       return reinterpret_cast<ObjCMethodDecl *>(SelectorOrMethod);
829
830     return 0;
831   }
832
833   void setMethodDecl(ObjCMethodDecl *MD) { 
834     HasMethod = true;
835     SelectorOrMethod = reinterpret_cast<uintptr_t>(MD);
836   }
837
838   ObjCMethodFamily getMethodFamily() const {
839     if (HasMethod) return getMethodDecl()->getMethodFamily();
840     return getSelector().getMethodFamily();
841   }
842
843   /// \brief Return the number of actual arguments in this message,
844   /// not counting the receiver.
845   unsigned getNumArgs() const { return NumArgs; }
846
847   /// \brief Retrieve the arguments to this message, not including the
848   /// receiver.
849   Expr **getArgs() {
850     return reinterpret_cast<Expr **>(this + 1) + 1;
851   }
852   const Expr * const *getArgs() const {
853     return reinterpret_cast<const Expr * const *>(this + 1) + 1;
854   }
855
856   /// getArg - Return the specified argument.
857   Expr *getArg(unsigned Arg) {
858     assert(Arg < NumArgs && "Arg access out of range!");
859     return cast<Expr>(getArgs()[Arg]);
860   }
861   const Expr *getArg(unsigned Arg) const {
862     assert(Arg < NumArgs && "Arg access out of range!");
863     return cast<Expr>(getArgs()[Arg]);
864   }
865   /// setArg - Set the specified argument.
866   void setArg(unsigned Arg, Expr *ArgExpr) {
867     assert(Arg < NumArgs && "Arg access out of range!");
868     getArgs()[Arg] = ArgExpr;
869   }
870
871   /// isDelegateInitCall - Answers whether this message send has been
872   /// tagged as a "delegate init call", i.e. a call to a method in the
873   /// -init family on self from within an -init method implementation.
874   bool isDelegateInitCall() const { return IsDelegateInitCall; }
875   void setDelegateInitCall(bool isDelegate) { IsDelegateInitCall = isDelegate; }
876
877   SourceLocation getLeftLoc() const { return LBracLoc; }
878   SourceLocation getRightLoc() const { return RBracLoc; }
879
880   SourceLocation getSelectorStartLoc() const { return getSelectorLoc(0); }
881   SourceLocation getSelectorLoc(unsigned Index) const {
882     assert(Index < getNumSelectorLocs() && "Index out of range!");
883     if (hasStandardSelLocs())
884       return getStandardSelectorLoc(Index, getSelector(),
885                                    getSelLocsKind() == SelLoc_StandardWithSpace,
886                                llvm::makeArrayRef(const_cast<Expr**>(getArgs()),
887                                                   getNumArgs()),
888                                    RBracLoc);
889     return getStoredSelLocs()[Index];
890   }
891
892   void getSelectorLocs(SmallVectorImpl<SourceLocation> &SelLocs) const;
893
894   unsigned getNumSelectorLocs() const {
895     Selector Sel = getSelector();
896     if (Sel.isUnarySelector())
897       return 1;
898     return Sel.getNumArgs();
899   }
900
901   void setSourceRange(SourceRange R) {
902     LBracLoc = R.getBegin();
903     RBracLoc = R.getEnd();
904   }
905   SourceRange getSourceRange() const {
906     return SourceRange(LBracLoc, RBracLoc);
907   }
908
909   static bool classof(const Stmt *T) {
910     return T->getStmtClass() == ObjCMessageExprClass;
911   }
912   static bool classof(const ObjCMessageExpr *) { return true; }
913
914   // Iterators
915   child_range children();
916
917   typedef ExprIterator arg_iterator;
918   typedef ConstExprIterator const_arg_iterator;
919
920   arg_iterator arg_begin() { return reinterpret_cast<Stmt **>(getArgs()); }
921   arg_iterator arg_end()   { 
922     return reinterpret_cast<Stmt **>(getArgs() + NumArgs); 
923   }
924   const_arg_iterator arg_begin() const { 
925     return reinterpret_cast<Stmt const * const*>(getArgs()); 
926   }
927   const_arg_iterator arg_end() const { 
928     return reinterpret_cast<Stmt const * const*>(getArgs() + NumArgs); 
929   }
930
931   friend class ASTStmtReader;
932   friend class ASTStmtWriter;
933 };
934
935 /// ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
936 /// (similar in spirit to MemberExpr).
937 class ObjCIsaExpr : public Expr {
938   /// Base - the expression for the base object pointer.
939   Stmt *Base;
940
941   /// IsaMemberLoc - This is the location of the 'isa'.
942   SourceLocation IsaMemberLoc;
943
944   /// IsArrow - True if this is "X->F", false if this is "X.F".
945   bool IsArrow;
946 public:
947   ObjCIsaExpr(Expr *base, bool isarrow, SourceLocation l, QualType ty)
948     : Expr(ObjCIsaExprClass, ty, VK_LValue, OK_Ordinary,
949            /*TypeDependent=*/false, base->isValueDependent(),
950            base->isInstantiationDependent(),
951            /*ContainsUnexpandedParameterPack=*/false),
952       Base(base), IsaMemberLoc(l), IsArrow(isarrow) {}
953
954   /// \brief Build an empty expression.
955   explicit ObjCIsaExpr(EmptyShell Empty) : Expr(ObjCIsaExprClass, Empty) { }
956
957   void setBase(Expr *E) { Base = E; }
958   Expr *getBase() const { return cast<Expr>(Base); }
959
960   bool isArrow() const { return IsArrow; }
961   void setArrow(bool A) { IsArrow = A; }
962
963   /// getMemberLoc - Return the location of the "member", in X->F, it is the
964   /// location of 'F'.
965   SourceLocation getIsaMemberLoc() const { return IsaMemberLoc; }
966   void setIsaMemberLoc(SourceLocation L) { IsaMemberLoc = L; }
967
968   SourceRange getSourceRange() const {
969     return SourceRange(getBase()->getLocStart(), IsaMemberLoc);
970   }
971
972   SourceLocation getExprLoc() const { return IsaMemberLoc; }
973
974   static bool classof(const Stmt *T) {
975     return T->getStmtClass() == ObjCIsaExprClass;
976   }
977   static bool classof(const ObjCIsaExpr *) { return true; }
978
979   // Iterators
980   child_range children() { return child_range(&Base, &Base+1); }
981 };
982
983
984 /// ObjCIndirectCopyRestoreExpr - Represents the passing of a function
985 /// argument by indirect copy-restore in ARC.  This is used to support
986 /// passing indirect arguments with the wrong lifetime, e.g. when
987 /// passing the address of a __strong local variable to an 'out'
988 /// parameter.  This expression kind is only valid in an "argument"
989 /// position to some sort of call expression.
990 ///
991 /// The parameter must have type 'pointer to T', and the argument must
992 /// have type 'pointer to U', where T and U agree except possibly in
993 /// qualification.  If the argument value is null, then a null pointer
994 /// is passed;  otherwise it points to an object A, and:
995 /// 1. A temporary object B of type T is initialized, either by
996 ///    zero-initialization (used when initializing an 'out' parameter)
997 ///    or copy-initialization (used when initializing an 'inout'
998 ///    parameter).
999 /// 2. The address of the temporary is passed to the function.
1000 /// 3. If the call completes normally, A is move-assigned from B.
1001 /// 4. Finally, A is destroyed immediately.
1002 ///
1003 /// Currently 'T' must be a retainable object lifetime and must be
1004 /// __autoreleasing;  this qualifier is ignored when initializing
1005 /// the value.
1006 class ObjCIndirectCopyRestoreExpr : public Expr {
1007   Stmt *Operand;
1008
1009   // unsigned ObjCIndirectCopyRestoreBits.ShouldCopy : 1;
1010
1011   friend class ASTReader;
1012   friend class ASTStmtReader;
1013
1014   void setShouldCopy(bool shouldCopy) {
1015     ObjCIndirectCopyRestoreExprBits.ShouldCopy = shouldCopy;
1016   }
1017
1018   explicit ObjCIndirectCopyRestoreExpr(EmptyShell Empty)
1019     : Expr(ObjCIndirectCopyRestoreExprClass, Empty) { }
1020
1021 public:
1022   ObjCIndirectCopyRestoreExpr(Expr *operand, QualType type, bool shouldCopy)
1023     : Expr(ObjCIndirectCopyRestoreExprClass, type, VK_LValue, OK_Ordinary,
1024            operand->isTypeDependent(), operand->isValueDependent(),
1025            operand->isInstantiationDependent(),
1026            operand->containsUnexpandedParameterPack()),
1027       Operand(operand) {
1028     setShouldCopy(shouldCopy);
1029   }
1030
1031   Expr *getSubExpr() { return cast<Expr>(Operand); }
1032   const Expr *getSubExpr() const { return cast<Expr>(Operand); }
1033
1034   /// shouldCopy - True if we should do the 'copy' part of the
1035   /// copy-restore.  If false, the temporary will be zero-initialized.
1036   bool shouldCopy() const { return ObjCIndirectCopyRestoreExprBits.ShouldCopy; }
1037
1038   child_range children() { return child_range(&Operand, &Operand+1); }  
1039
1040   // Source locations are determined by the subexpression.
1041   SourceRange getSourceRange() const { return Operand->getSourceRange(); }
1042   SourceLocation getExprLoc() const { return getSubExpr()->getExprLoc(); }
1043
1044   static bool classof(const Stmt *s) {
1045     return s->getStmtClass() == ObjCIndirectCopyRestoreExprClass;
1046   }
1047   static bool classof(const ObjCIndirectCopyRestoreExpr *) { return true; }
1048 };
1049
1050 /// \brief An Objective-C "bridged" cast expression, which casts between
1051 /// Objective-C pointers and C pointers, transferring ownership in the process.
1052 ///
1053 /// \code
1054 /// NSString *str = (__bridge_transfer NSString *)CFCreateString();
1055 /// \endcode
1056 class ObjCBridgedCastExpr : public ExplicitCastExpr {
1057   SourceLocation LParenLoc;
1058   SourceLocation BridgeKeywordLoc;
1059   unsigned Kind : 2;
1060   
1061   friend class ASTStmtReader;
1062   friend class ASTStmtWriter;
1063   
1064 public:
1065   ObjCBridgedCastExpr(SourceLocation LParenLoc, ObjCBridgeCastKind Kind,
1066                       CastKind CK, SourceLocation BridgeKeywordLoc,
1067                       TypeSourceInfo *TSInfo, Expr *Operand)
1068     : ExplicitCastExpr(ObjCBridgedCastExprClass, TSInfo->getType(), VK_RValue,
1069                        CK, Operand, 0, TSInfo),
1070       LParenLoc(LParenLoc), BridgeKeywordLoc(BridgeKeywordLoc), Kind(Kind) { }
1071   
1072   /// \brief Construct an empty Objective-C bridged cast.
1073   explicit ObjCBridgedCastExpr(EmptyShell Shell)
1074     : ExplicitCastExpr(ObjCBridgedCastExprClass, Shell, 0) { }
1075
1076   SourceLocation getLParenLoc() const { return LParenLoc; }
1077
1078   /// \brief Determine which kind of bridge is being performed via this cast.
1079   ObjCBridgeCastKind getBridgeKind() const { 
1080     return static_cast<ObjCBridgeCastKind>(Kind); 
1081   }
1082   
1083   /// \brief Retrieve the kind of bridge being performed as a string.
1084   StringRef getBridgeKindName() const;
1085   
1086   /// \brief The location of the bridge keyword.
1087   SourceLocation getBridgeKeywordLoc() const { return BridgeKeywordLoc; }
1088   
1089   SourceRange getSourceRange() const {
1090     return SourceRange(LParenLoc, getSubExpr()->getLocEnd());
1091   }
1092   
1093   static bool classof(const Stmt *T) {
1094     return T->getStmtClass() == ObjCBridgedCastExprClass;
1095   }
1096   static bool classof(const ObjCBridgedCastExpr *) { return true; }
1097  
1098 };
1099   
1100 }  // end namespace clang
1101
1102 #endif