Home | History | Annotate | Download | only in AST
      1 //===--- DeclObjC.cpp - ObjC Declaration AST Node Implementation ----------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements the Objective-C related Decl classes.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/AST/DeclObjC.h"
     15 #include "clang/AST/ASTContext.h"
     16 #include "clang/AST/Stmt.h"
     17 #include "clang/AST/ASTMutationListener.h"
     18 #include "llvm/ADT/STLExtras.h"
     19 using namespace clang;
     20 
     21 //===----------------------------------------------------------------------===//
     22 // ObjCListBase
     23 //===----------------------------------------------------------------------===//
     24 
     25 void ObjCListBase::set(void *const* InList, unsigned Elts, ASTContext &Ctx) {
     26   List = 0;
     27   if (Elts == 0) return;  // Setting to an empty list is a noop.
     28 
     29 
     30   List = new (Ctx) void*[Elts];
     31   NumElts = Elts;
     32   memcpy(List, InList, sizeof(void*)*Elts);
     33 }
     34 
     35 void ObjCProtocolList::set(ObjCProtocolDecl* const* InList, unsigned Elts,
     36                            const SourceLocation *Locs, ASTContext &Ctx) {
     37   if (Elts == 0)
     38     return;
     39 
     40   Locations = new (Ctx) SourceLocation[Elts];
     41   memcpy(Locations, Locs, sizeof(SourceLocation) * Elts);
     42   set(InList, Elts, Ctx);
     43 }
     44 
     45 //===----------------------------------------------------------------------===//
     46 // ObjCInterfaceDecl
     47 //===----------------------------------------------------------------------===//
     48 
     49 /// getIvarDecl - This method looks up an ivar in this ContextDecl.
     50 ///
     51 ObjCIvarDecl *
     52 ObjCContainerDecl::getIvarDecl(IdentifierInfo *Id) const {
     53   lookup_const_iterator Ivar, IvarEnd;
     54   for (llvm::tie(Ivar, IvarEnd) = lookup(Id); Ivar != IvarEnd; ++Ivar) {
     55     if (ObjCIvarDecl *ivar = dyn_cast<ObjCIvarDecl>(*Ivar))
     56       return ivar;
     57   }
     58   return 0;
     59 }
     60 
     61 // Get the local instance/class method declared in this interface.
     62 ObjCMethodDecl *
     63 ObjCContainerDecl::getMethod(Selector Sel, bool isInstance) const {
     64   // Since instance & class methods can have the same name, the loop below
     65   // ensures we get the correct method.
     66   //
     67   // @interface Whatever
     68   // - (int) class_method;
     69   // + (float) class_method;
     70   // @end
     71   //
     72   lookup_const_iterator Meth, MethEnd;
     73   for (llvm::tie(Meth, MethEnd) = lookup(Sel); Meth != MethEnd; ++Meth) {
     74     ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(*Meth);
     75     if (MD && MD->isInstanceMethod() == isInstance)
     76       return MD;
     77   }
     78   return 0;
     79 }
     80 
     81 ObjCPropertyDecl *
     82 ObjCPropertyDecl::findPropertyDecl(const DeclContext *DC,
     83                                    IdentifierInfo *propertyID) {
     84 
     85   DeclContext::lookup_const_iterator I, E;
     86   llvm::tie(I, E) = DC->lookup(propertyID);
     87   for ( ; I != E; ++I)
     88     if (ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(*I))
     89       return PD;
     90 
     91   return 0;
     92 }
     93 
     94 /// FindPropertyDeclaration - Finds declaration of the property given its name
     95 /// in 'PropertyId' and returns it. It returns 0, if not found.
     96 ObjCPropertyDecl *
     97 ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const {
     98 
     99   if (ObjCPropertyDecl *PD =
    100         ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(this), PropertyId))
    101     return PD;
    102 
    103   switch (getKind()) {
    104     default:
    105       break;
    106     case Decl::ObjCProtocol: {
    107       const ObjCProtocolDecl *PID = cast<ObjCProtocolDecl>(this);
    108       for (ObjCProtocolDecl::protocol_iterator I = PID->protocol_begin(),
    109            E = PID->protocol_end(); I != E; ++I)
    110         if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
    111           return P;
    112       break;
    113     }
    114     case Decl::ObjCInterface: {
    115       const ObjCInterfaceDecl *OID = cast<ObjCInterfaceDecl>(this);
    116       // Look through categories.
    117       for (ObjCCategoryDecl *Cat = OID->getCategoryList();
    118            Cat; Cat = Cat->getNextClassCategory())
    119         if (!Cat->IsClassExtension())
    120           if (ObjCPropertyDecl *P = Cat->FindPropertyDeclaration(PropertyId))
    121             return P;
    122 
    123       // Look through protocols.
    124       for (ObjCInterfaceDecl::all_protocol_iterator
    125             I = OID->all_referenced_protocol_begin(),
    126             E = OID->all_referenced_protocol_end(); I != E; ++I)
    127         if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
    128           return P;
    129 
    130       // Finally, check the super class.
    131       if (const ObjCInterfaceDecl *superClass = OID->getSuperClass())
    132         return superClass->FindPropertyDeclaration(PropertyId);
    133       break;
    134     }
    135     case Decl::ObjCCategory: {
    136       const ObjCCategoryDecl *OCD = cast<ObjCCategoryDecl>(this);
    137       // Look through protocols.
    138       if (!OCD->IsClassExtension())
    139         for (ObjCCategoryDecl::protocol_iterator
    140               I = OCD->protocol_begin(), E = OCD->protocol_end(); I != E; ++I)
    141         if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
    142           return P;
    143 
    144       break;
    145     }
    146   }
    147   return 0;
    148 }
    149 
    150 /// FindPropertyVisibleInPrimaryClass - Finds declaration of the property
    151 /// with name 'PropertyId' in the primary class; including those in protocols
    152 /// (direct or indirect) used by the primary class.
    153 ///
    154 ObjCPropertyDecl *
    155 ObjCInterfaceDecl::FindPropertyVisibleInPrimaryClass(
    156                                             IdentifierInfo *PropertyId) const {
    157   if (ExternallyCompleted)
    158     LoadExternalDefinition();
    159 
    160   if (ObjCPropertyDecl *PD =
    161       ObjCPropertyDecl::findPropertyDecl(cast<DeclContext>(this), PropertyId))
    162     return PD;
    163 
    164   // Look through protocols.
    165   for (ObjCInterfaceDecl::all_protocol_iterator
    166         I = all_referenced_protocol_begin(),
    167         E = all_referenced_protocol_end(); I != E; ++I)
    168     if (ObjCPropertyDecl *P = (*I)->FindPropertyDeclaration(PropertyId))
    169       return P;
    170 
    171   return 0;
    172 }
    173 
    174 void ObjCInterfaceDecl::mergeClassExtensionProtocolList(
    175                               ObjCProtocolDecl *const* ExtList, unsigned ExtNum,
    176                               ASTContext &C)
    177 {
    178   if (ExternallyCompleted)
    179     LoadExternalDefinition();
    180 
    181   if (AllReferencedProtocols.empty() && ReferencedProtocols.empty()) {
    182     AllReferencedProtocols.set(ExtList, ExtNum, C);
    183     return;
    184   }
    185 
    186   // Check for duplicate protocol in class's protocol list.
    187   // This is O(n*m). But it is extremely rare and number of protocols in
    188   // class or its extension are very few.
    189   SmallVector<ObjCProtocolDecl*, 8> ProtocolRefs;
    190   for (unsigned i = 0; i < ExtNum; i++) {
    191     bool protocolExists = false;
    192     ObjCProtocolDecl *ProtoInExtension = ExtList[i];
    193     for (all_protocol_iterator
    194           p = all_referenced_protocol_begin(),
    195           e = all_referenced_protocol_end(); p != e; ++p) {
    196       ObjCProtocolDecl *Proto = (*p);
    197       if (C.ProtocolCompatibleWithProtocol(ProtoInExtension, Proto)) {
    198         protocolExists = true;
    199         break;
    200       }
    201     }
    202     // Do we want to warn on a protocol in extension class which
    203     // already exist in the class? Probably not.
    204     if (!protocolExists)
    205       ProtocolRefs.push_back(ProtoInExtension);
    206   }
    207 
    208   if (ProtocolRefs.empty())
    209     return;
    210 
    211   // Merge ProtocolRefs into class's protocol list;
    212   for (all_protocol_iterator p = all_referenced_protocol_begin(),
    213         e = all_referenced_protocol_end(); p != e; ++p) {
    214     ProtocolRefs.push_back(*p);
    215   }
    216 
    217   AllReferencedProtocols.set(ProtocolRefs.data(), ProtocolRefs.size(), C);
    218 }
    219 
    220 /// getFirstClassExtension - Find first class extension of the given class.
    221 ObjCCategoryDecl* ObjCInterfaceDecl::getFirstClassExtension() const {
    222   for (ObjCCategoryDecl *CDecl = getCategoryList(); CDecl;
    223        CDecl = CDecl->getNextClassCategory())
    224     if (CDecl->IsClassExtension())
    225       return CDecl;
    226   return 0;
    227 }
    228 
    229 /// getNextClassCategory - Find next class extension in list of categories.
    230 const ObjCCategoryDecl* ObjCCategoryDecl::getNextClassExtension() const {
    231   for (const ObjCCategoryDecl *CDecl = getNextClassCategory(); CDecl;
    232         CDecl = CDecl->getNextClassCategory())
    233     if (CDecl->IsClassExtension())
    234       return CDecl;
    235   return 0;
    236 }
    237 
    238 ObjCIvarDecl *ObjCInterfaceDecl::lookupInstanceVariable(IdentifierInfo *ID,
    239                                               ObjCInterfaceDecl *&clsDeclared) {
    240   if (ExternallyCompleted)
    241     LoadExternalDefinition();
    242 
    243   ObjCInterfaceDecl* ClassDecl = this;
    244   while (ClassDecl != NULL) {
    245     if (ObjCIvarDecl *I = ClassDecl->getIvarDecl(ID)) {
    246       clsDeclared = ClassDecl;
    247       return I;
    248     }
    249     for (const ObjCCategoryDecl *CDecl = ClassDecl->getFirstClassExtension();
    250          CDecl; CDecl = CDecl->getNextClassExtension()) {
    251       if (ObjCIvarDecl *I = CDecl->getIvarDecl(ID)) {
    252         clsDeclared = ClassDecl;
    253         return I;
    254       }
    255     }
    256 
    257     ClassDecl = ClassDecl->getSuperClass();
    258   }
    259   return NULL;
    260 }
    261 
    262 /// lookupInheritedClass - This method returns ObjCInterfaceDecl * of the super
    263 /// class whose name is passed as argument. If it is not one of the super classes
    264 /// the it returns NULL.
    265 ObjCInterfaceDecl *ObjCInterfaceDecl::lookupInheritedClass(
    266                                         const IdentifierInfo*ICName) {
    267   if (ExternallyCompleted)
    268     LoadExternalDefinition();
    269 
    270   ObjCInterfaceDecl* ClassDecl = this;
    271   while (ClassDecl != NULL) {
    272     if (ClassDecl->getIdentifier() == ICName)
    273       return ClassDecl;
    274     ClassDecl = ClassDecl->getSuperClass();
    275   }
    276   return NULL;
    277 }
    278 
    279 /// lookupMethod - This method returns an instance/class method by looking in
    280 /// the class, its categories, and its super classes (using a linear search).
    281 ObjCMethodDecl *ObjCInterfaceDecl::lookupMethod(Selector Sel,
    282                                                 bool isInstance) const {
    283   const ObjCInterfaceDecl* ClassDecl = this;
    284   ObjCMethodDecl *MethodDecl = 0;
    285 
    286   if (ExternallyCompleted)
    287     LoadExternalDefinition();
    288 
    289   while (ClassDecl != NULL) {
    290     if ((MethodDecl = ClassDecl->getMethod(Sel, isInstance)))
    291       return MethodDecl;
    292 
    293     // Didn't find one yet - look through protocols.
    294     const ObjCList<ObjCProtocolDecl> &Protocols =
    295       ClassDecl->getReferencedProtocols();
    296     for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
    297          E = Protocols.end(); I != E; ++I)
    298       if ((MethodDecl = (*I)->lookupMethod(Sel, isInstance)))
    299         return MethodDecl;
    300 
    301     // Didn't find one yet - now look through categories.
    302     ObjCCategoryDecl *CatDecl = ClassDecl->getCategoryList();
    303     while (CatDecl) {
    304       if ((MethodDecl = CatDecl->getMethod(Sel, isInstance)))
    305         return MethodDecl;
    306 
    307       // Didn't find one yet - look through protocols.
    308       const ObjCList<ObjCProtocolDecl> &Protocols =
    309         CatDecl->getReferencedProtocols();
    310       for (ObjCList<ObjCProtocolDecl>::iterator I = Protocols.begin(),
    311            E = Protocols.end(); I != E; ++I)
    312         if ((MethodDecl = (*I)->lookupMethod(Sel, isInstance)))
    313           return MethodDecl;
    314       CatDecl = CatDecl->getNextClassCategory();
    315     }
    316     ClassDecl = ClassDecl->getSuperClass();
    317   }
    318   return NULL;
    319 }
    320 
    321 ObjCMethodDecl *ObjCInterfaceDecl::lookupPrivateMethod(
    322                                    const Selector &Sel,
    323                                    bool Instance) {
    324   if (ExternallyCompleted)
    325     LoadExternalDefinition();
    326 
    327   ObjCMethodDecl *Method = 0;
    328   if (ObjCImplementationDecl *ImpDecl = getImplementation())
    329     Method = Instance ? ImpDecl->getInstanceMethod(Sel)
    330                       : ImpDecl->getClassMethod(Sel);
    331 
    332   if (!Method && getSuperClass())
    333     return getSuperClass()->lookupPrivateMethod(Sel, Instance);
    334   return Method;
    335 }
    336 
    337 //===----------------------------------------------------------------------===//
    338 // ObjCMethodDecl
    339 //===----------------------------------------------------------------------===//
    340 
    341 ObjCMethodDecl *ObjCMethodDecl::Create(ASTContext &C,
    342                                        SourceLocation beginLoc,
    343                                        SourceLocation endLoc,
    344                                        Selector SelInfo, QualType T,
    345                                        TypeSourceInfo *ResultTInfo,
    346                                        DeclContext *contextDecl,
    347                                        bool isInstance,
    348                                        bool isVariadic,
    349                                        bool isSynthesized,
    350                                        bool isImplicitlyDeclared,
    351                                        bool isDefined,
    352                                        ImplementationControl impControl,
    353                                        bool HasRelatedResultType) {
    354   return new (C) ObjCMethodDecl(beginLoc, endLoc,
    355                                 SelInfo, T, ResultTInfo, contextDecl,
    356                                 isInstance,
    357                                 isVariadic, isSynthesized, isImplicitlyDeclared,
    358                                 isDefined,
    359                                 impControl,
    360                                 HasRelatedResultType);
    361 }
    362 
    363 void ObjCMethodDecl::setAsRedeclaration(const ObjCMethodDecl *PrevMethod) {
    364   assert(PrevMethod);
    365   getASTContext().setObjCMethodRedeclaration(PrevMethod, this);
    366   IsRedeclaration = true;
    367   PrevMethod->HasRedeclaration = true;
    368 }
    369 
    370 void ObjCMethodDecl::setParamsAndSelLocs(ASTContext &C,
    371                                          ArrayRef<ParmVarDecl*> Params,
    372                                          ArrayRef<SourceLocation> SelLocs) {
    373   ParamsAndSelLocs = 0;
    374   NumParams = Params.size();
    375   if (Params.empty() && SelLocs.empty())
    376     return;
    377 
    378   unsigned Size = sizeof(ParmVarDecl *) * NumParams +
    379                   sizeof(SourceLocation) * SelLocs.size();
    380   ParamsAndSelLocs = C.Allocate(Size);
    381   std::copy(Params.begin(), Params.end(), getParams());
    382   std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
    383 }
    384 
    385 void ObjCMethodDecl::getSelectorLocs(
    386                                SmallVectorImpl<SourceLocation> &SelLocs) const {
    387   for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i)
    388     SelLocs.push_back(getSelectorLoc(i));
    389 }
    390 
    391 void ObjCMethodDecl::setMethodParams(ASTContext &C,
    392                                      ArrayRef<ParmVarDecl*> Params,
    393                                      ArrayRef<SourceLocation> SelLocs) {
    394   assert((!SelLocs.empty() || isImplicit()) &&
    395          "No selector locs for non-implicit method");
    396   if (isImplicit())
    397     return setParamsAndSelLocs(C, Params, ArrayRef<SourceLocation>());
    398 
    399   SelLocsKind = hasStandardSelectorLocs(getSelector(), SelLocs, Params, EndLoc);
    400   if (SelLocsKind != SelLoc_NonStandard)
    401     return setParamsAndSelLocs(C, Params, ArrayRef<SourceLocation>());
    402 
    403   setParamsAndSelLocs(C, Params, SelLocs);
    404 }
    405 
    406 /// \brief A definition will return its interface declaration.
    407 /// An interface declaration will return its definition.
    408 /// Otherwise it will return itself.
    409 ObjCMethodDecl *ObjCMethodDecl::getNextRedeclaration() {
    410   ASTContext &Ctx = getASTContext();
    411   ObjCMethodDecl *Redecl = 0;
    412   if (HasRedeclaration)
    413     Redecl = const_cast<ObjCMethodDecl*>(Ctx.getObjCMethodRedeclaration(this));
    414   if (Redecl)
    415     return Redecl;
    416 
    417   Decl *CtxD = cast<Decl>(getDeclContext());
    418 
    419   if (ObjCInterfaceDecl *IFD = dyn_cast<ObjCInterfaceDecl>(CtxD)) {
    420     if (ObjCImplementationDecl *ImplD = Ctx.getObjCImplementation(IFD))
    421       Redecl = ImplD->getMethod(getSelector(), isInstanceMethod());
    422 
    423   } else if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(CtxD)) {
    424     if (ObjCCategoryImplDecl *ImplD = Ctx.getObjCImplementation(CD))
    425       Redecl = ImplD->getMethod(getSelector(), isInstanceMethod());
    426 
    427   } else if (ObjCImplementationDecl *ImplD =
    428                dyn_cast<ObjCImplementationDecl>(CtxD)) {
    429     if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
    430       Redecl = IFD->getMethod(getSelector(), isInstanceMethod());
    431 
    432   } else if (ObjCCategoryImplDecl *CImplD =
    433                dyn_cast<ObjCCategoryImplDecl>(CtxD)) {
    434     if (ObjCCategoryDecl *CatD = CImplD->getCategoryDecl())
    435       Redecl = CatD->getMethod(getSelector(), isInstanceMethod());
    436   }
    437 
    438   if (!Redecl && isRedeclaration()) {
    439     // This is the last redeclaration, go back to the first method.
    440     return cast<ObjCContainerDecl>(CtxD)->getMethod(getSelector(),
    441                                                     isInstanceMethod());
    442   }
    443 
    444   return Redecl ? Redecl : this;
    445 }
    446 
    447 ObjCMethodDecl *ObjCMethodDecl::getCanonicalDecl() {
    448   Decl *CtxD = cast<Decl>(getDeclContext());
    449 
    450   if (ObjCImplementationDecl *ImplD = dyn_cast<ObjCImplementationDecl>(CtxD)) {
    451     if (ObjCInterfaceDecl *IFD = ImplD->getClassInterface())
    452       if (ObjCMethodDecl *MD = IFD->getMethod(getSelector(),
    453                                               isInstanceMethod()))
    454         return MD;
    455 
    456   } else if (ObjCCategoryImplDecl *CImplD =
    457                dyn_cast<ObjCCategoryImplDecl>(CtxD)) {
    458     if (ObjCCategoryDecl *CatD = CImplD->getCategoryDecl())
    459       if (ObjCMethodDecl *MD = CatD->getMethod(getSelector(),
    460                                                isInstanceMethod()))
    461         return MD;
    462   }
    463 
    464   if (isRedeclaration())
    465     return cast<ObjCContainerDecl>(CtxD)->getMethod(getSelector(),
    466                                                     isInstanceMethod());
    467 
    468   return this;
    469 }
    470 
    471 ObjCMethodFamily ObjCMethodDecl::getMethodFamily() const {
    472   ObjCMethodFamily family = static_cast<ObjCMethodFamily>(Family);
    473   if (family != static_cast<unsigned>(InvalidObjCMethodFamily))
    474     return family;
    475 
    476   // Check for an explicit attribute.
    477   if (const ObjCMethodFamilyAttr *attr = getAttr<ObjCMethodFamilyAttr>()) {
    478     // The unfortunate necessity of mapping between enums here is due
    479     // to the attributes framework.
    480     switch (attr->getFamily()) {
    481     case ObjCMethodFamilyAttr::OMF_None: family = OMF_None; break;
    482     case ObjCMethodFamilyAttr::OMF_alloc: family = OMF_alloc; break;
    483     case ObjCMethodFamilyAttr::OMF_copy: family = OMF_copy; break;
    484     case ObjCMethodFamilyAttr::OMF_init: family = OMF_init; break;
    485     case ObjCMethodFamilyAttr::OMF_mutableCopy: family = OMF_mutableCopy; break;
    486     case ObjCMethodFamilyAttr::OMF_new: family = OMF_new; break;
    487     }
    488     Family = static_cast<unsigned>(family);
    489     return family;
    490   }
    491 
    492   family = getSelector().getMethodFamily();
    493   switch (family) {
    494   case OMF_None: break;
    495 
    496   // init only has a conventional meaning for an instance method, and
    497   // it has to return an object.
    498   case OMF_init:
    499     if (!isInstanceMethod() || !getResultType()->isObjCObjectPointerType())
    500       family = OMF_None;
    501     break;
    502 
    503   // alloc/copy/new have a conventional meaning for both class and
    504   // instance methods, but they require an object return.
    505   case OMF_alloc:
    506   case OMF_copy:
    507   case OMF_mutableCopy:
    508   case OMF_new:
    509     if (!getResultType()->isObjCObjectPointerType())
    510       family = OMF_None;
    511     break;
    512 
    513   // These selectors have a conventional meaning only for instance methods.
    514   case OMF_dealloc:
    515   case OMF_finalize:
    516   case OMF_retain:
    517   case OMF_release:
    518   case OMF_autorelease:
    519   case OMF_retainCount:
    520   case OMF_self:
    521     if (!isInstanceMethod())
    522       family = OMF_None;
    523     break;
    524 
    525   case OMF_performSelector:
    526     if (!isInstanceMethod() ||
    527         !getResultType()->isObjCIdType())
    528       family = OMF_None;
    529     else {
    530       unsigned noParams = param_size();
    531       if (noParams < 1 || noParams > 3)
    532         family = OMF_None;
    533       else {
    534         ObjCMethodDecl::arg_type_iterator it = arg_type_begin();
    535         QualType ArgT = (*it);
    536         if (!ArgT->isObjCSelType()) {
    537           family = OMF_None;
    538           break;
    539         }
    540         while (--noParams) {
    541           it++;
    542           ArgT = (*it);
    543           if (!ArgT->isObjCIdType()) {
    544             family = OMF_None;
    545             break;
    546           }
    547         }
    548       }
    549     }
    550     break;
    551 
    552   }
    553 
    554   // Cache the result.
    555   Family = static_cast<unsigned>(family);
    556   return family;
    557 }
    558 
    559 void ObjCMethodDecl::createImplicitParams(ASTContext &Context,
    560                                           const ObjCInterfaceDecl *OID) {
    561   QualType selfTy;
    562   if (isInstanceMethod()) {
    563     // There may be no interface context due to error in declaration
    564     // of the interface (which has been reported). Recover gracefully.
    565     if (OID) {
    566       selfTy = Context.getObjCInterfaceType(OID);
    567       selfTy = Context.getObjCObjectPointerType(selfTy);
    568     } else {
    569       selfTy = Context.getObjCIdType();
    570     }
    571   } else // we have a factory method.
    572     selfTy = Context.getObjCClassType();
    573 
    574   bool selfIsPseudoStrong = false;
    575   bool selfIsConsumed = false;
    576   if (isInstanceMethod() && Context.getLangOptions().ObjCAutoRefCount) {
    577     selfIsConsumed = hasAttr<NSConsumesSelfAttr>();
    578 
    579     // 'self' is always __strong.  It's actually pseudo-strong except
    580     // in init methods, though.
    581     Qualifiers qs;
    582     qs.setObjCLifetime(Qualifiers::OCL_Strong);
    583     selfTy = Context.getQualifiedType(selfTy, qs);
    584 
    585     // In addition, 'self' is const unless this is an init method.
    586     if (getMethodFamily() != OMF_init) {
    587       selfTy = selfTy.withConst();
    588       selfIsPseudoStrong = true;
    589     }
    590   }
    591 
    592   ImplicitParamDecl *self
    593     = ImplicitParamDecl::Create(Context, this, SourceLocation(),
    594                                 &Context.Idents.get("self"), selfTy);
    595   setSelfDecl(self);
    596 
    597   if (selfIsConsumed)
    598     self->addAttr(new (Context) NSConsumedAttr(SourceLocation(), Context));
    599 
    600   if (selfIsPseudoStrong)
    601     self->setARCPseudoStrong(true);
    602 
    603   setCmdDecl(ImplicitParamDecl::Create(Context, this, SourceLocation(),
    604                                        &Context.Idents.get("_cmd"),
    605                                        Context.getObjCSelType()));
    606 }
    607 
    608 ObjCInterfaceDecl *ObjCMethodDecl::getClassInterface() {
    609   if (ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(getDeclContext()))
    610     return ID;
    611   if (ObjCCategoryDecl *CD = dyn_cast<ObjCCategoryDecl>(getDeclContext()))
    612     return CD->getClassInterface();
    613   if (ObjCImplDecl *IMD = dyn_cast<ObjCImplDecl>(getDeclContext()))
    614     return IMD->getClassInterface();
    615 
    616   assert(!isa<ObjCProtocolDecl>(getDeclContext()) && "It's a protocol method");
    617   llvm_unreachable("unknown method context");
    618 }
    619 
    620 //===----------------------------------------------------------------------===//
    621 // ObjCInterfaceDecl
    622 //===----------------------------------------------------------------------===//
    623 
    624 ObjCInterfaceDecl *ObjCInterfaceDecl::Create(ASTContext &C,
    625                                              DeclContext *DC,
    626                                              SourceLocation atLoc,
    627                                              IdentifierInfo *Id,
    628                                              SourceLocation ClassLoc,
    629                                              bool ForwardDecl, bool isInternal){
    630   return new (C) ObjCInterfaceDecl(DC, atLoc, Id, ClassLoc, ForwardDecl,
    631                                      isInternal);
    632 }
    633 
    634 ObjCInterfaceDecl::
    635 ObjCInterfaceDecl(DeclContext *DC, SourceLocation atLoc, IdentifierInfo *Id,
    636                   SourceLocation CLoc, bool FD, bool isInternal)
    637   : ObjCContainerDecl(ObjCInterface, DC, Id, CLoc, atLoc),
    638     TypeForDecl(0), SuperClass(0),
    639     CategoryList(0), IvarList(0),
    640     InitiallyForwardDecl(FD), ForwardDecl(FD),
    641     InternalInterface(isInternal), ExternallyCompleted(false) {
    642 }
    643 
    644 void ObjCInterfaceDecl::LoadExternalDefinition() const {
    645   assert(ExternallyCompleted && "Class is not externally completed");
    646   ExternallyCompleted = false;
    647   getASTContext().getExternalSource()->CompleteType(
    648                                         const_cast<ObjCInterfaceDecl *>(this));
    649 }
    650 
    651 void ObjCInterfaceDecl::setExternallyCompleted() {
    652   assert(getASTContext().getExternalSource() &&
    653          "Class can't be externally completed without an external source");
    654   assert(!ForwardDecl &&
    655          "Forward declarations can't be externally completed");
    656   ExternallyCompleted = true;
    657 }
    658 
    659 ObjCImplementationDecl *ObjCInterfaceDecl::getImplementation() const {
    660   if (ExternallyCompleted)
    661     LoadExternalDefinition();
    662 
    663   return getASTContext().getObjCImplementation(
    664                                           const_cast<ObjCInterfaceDecl*>(this));
    665 }
    666 
    667 void ObjCInterfaceDecl::setImplementation(ObjCImplementationDecl *ImplD) {
    668   getASTContext().setObjCImplementation(this, ImplD);
    669 }
    670 
    671 /// all_declared_ivar_begin - return first ivar declared in this class,
    672 /// its extensions and its implementation. Lazily build the list on first
    673 /// access.
    674 ObjCIvarDecl *ObjCInterfaceDecl::all_declared_ivar_begin() {
    675   if (IvarList)
    676     return IvarList;
    677 
    678   ObjCIvarDecl *curIvar = 0;
    679   if (!ivar_empty()) {
    680     ObjCInterfaceDecl::ivar_iterator I = ivar_begin(), E = ivar_end();
    681     IvarList = (*I); ++I;
    682     for (curIvar = IvarList; I != E; curIvar = *I, ++I)
    683       curIvar->setNextIvar(*I);
    684   }
    685 
    686   for (const ObjCCategoryDecl *CDecl = getFirstClassExtension(); CDecl;
    687        CDecl = CDecl->getNextClassExtension()) {
    688     if (!CDecl->ivar_empty()) {
    689       ObjCCategoryDecl::ivar_iterator I = CDecl->ivar_begin(),
    690                                           E = CDecl->ivar_end();
    691       if (!IvarList) {
    692         IvarList = (*I); ++I;
    693         curIvar = IvarList;
    694       }
    695       for ( ;I != E; curIvar = *I, ++I)
    696         curIvar->setNextIvar(*I);
    697     }
    698   }
    699 
    700   if (ObjCImplementationDecl *ImplDecl = getImplementation()) {
    701     if (!ImplDecl->ivar_empty()) {
    702       ObjCImplementationDecl::ivar_iterator I = ImplDecl->ivar_begin(),
    703                                             E = ImplDecl->ivar_end();
    704       if (!IvarList) {
    705         IvarList = (*I); ++I;
    706         curIvar = IvarList;
    707       }
    708       for ( ;I != E; curIvar = *I, ++I)
    709         curIvar->setNextIvar(*I);
    710     }
    711   }
    712   return IvarList;
    713 }
    714 
    715 /// FindCategoryDeclaration - Finds category declaration in the list of
    716 /// categories for this class and returns it. Name of the category is passed
    717 /// in 'CategoryId'. If category not found, return 0;
    718 ///
    719 ObjCCategoryDecl *
    720 ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const {
    721   if (ExternallyCompleted)
    722     LoadExternalDefinition();
    723 
    724   for (ObjCCategoryDecl *Category = getCategoryList();
    725        Category; Category = Category->getNextClassCategory())
    726     if (Category->getIdentifier() == CategoryId)
    727       return Category;
    728   return 0;
    729 }
    730 
    731 ObjCMethodDecl *
    732 ObjCInterfaceDecl::getCategoryInstanceMethod(Selector Sel) const {
    733   for (ObjCCategoryDecl *Category = getCategoryList();
    734        Category; Category = Category->getNextClassCategory())
    735     if (ObjCCategoryImplDecl *Impl = Category->getImplementation())
    736       if (ObjCMethodDecl *MD = Impl->getInstanceMethod(Sel))
    737         return MD;
    738   return 0;
    739 }
    740 
    741 ObjCMethodDecl *ObjCInterfaceDecl::getCategoryClassMethod(Selector Sel) const {
    742   for (ObjCCategoryDecl *Category = getCategoryList();
    743        Category; Category = Category->getNextClassCategory())
    744     if (ObjCCategoryImplDecl *Impl = Category->getImplementation())
    745       if (ObjCMethodDecl *MD = Impl->getClassMethod(Sel))
    746         return MD;
    747   return 0;
    748 }
    749 
    750 /// ClassImplementsProtocol - Checks that 'lProto' protocol
    751 /// has been implemented in IDecl class, its super class or categories (if
    752 /// lookupCategory is true).
    753 bool ObjCInterfaceDecl::ClassImplementsProtocol(ObjCProtocolDecl *lProto,
    754                                     bool lookupCategory,
    755                                     bool RHSIsQualifiedID) {
    756   ObjCInterfaceDecl *IDecl = this;
    757   // 1st, look up the class.
    758   const ObjCList<ObjCProtocolDecl> &Protocols =
    759   IDecl->getReferencedProtocols();
    760 
    761   for (ObjCList<ObjCProtocolDecl>::iterator PI = Protocols.begin(),
    762        E = Protocols.end(); PI != E; ++PI) {
    763     if (getASTContext().ProtocolCompatibleWithProtocol(lProto, *PI))
    764       return true;
    765     // This is dubious and is added to be compatible with gcc.  In gcc, it is
    766     // also allowed assigning a protocol-qualified 'id' type to a LHS object
    767     // when protocol in qualified LHS is in list of protocols in the rhs 'id'
    768     // object. This IMO, should be a bug.
    769     // FIXME: Treat this as an extension, and flag this as an error when GCC
    770     // extensions are not enabled.
    771     if (RHSIsQualifiedID &&
    772         getASTContext().ProtocolCompatibleWithProtocol(*PI, lProto))
    773       return true;
    774   }
    775 
    776   // 2nd, look up the category.
    777   if (lookupCategory)
    778     for (ObjCCategoryDecl *CDecl = IDecl->getCategoryList(); CDecl;
    779          CDecl = CDecl->getNextClassCategory()) {
    780       for (ObjCCategoryDecl::protocol_iterator PI = CDecl->protocol_begin(),
    781            E = CDecl->protocol_end(); PI != E; ++PI)
    782         if (getASTContext().ProtocolCompatibleWithProtocol(lProto, *PI))
    783           return true;
    784     }
    785 
    786   // 3rd, look up the super class(s)
    787   if (IDecl->getSuperClass())
    788     return
    789   IDecl->getSuperClass()->ClassImplementsProtocol(lProto, lookupCategory,
    790                                                   RHSIsQualifiedID);
    791 
    792   return false;
    793 }
    794 
    795 //===----------------------------------------------------------------------===//
    796 // ObjCIvarDecl
    797 //===----------------------------------------------------------------------===//
    798 
    799 ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC,
    800                                    SourceLocation StartLoc,
    801                                    SourceLocation IdLoc, IdentifierInfo *Id,
    802                                    QualType T, TypeSourceInfo *TInfo,
    803                                    AccessControl ac, Expr *BW,
    804                                    bool synthesized) {
    805   if (DC) {
    806     // Ivar's can only appear in interfaces, implementations (via synthesized
    807     // properties), and class extensions (via direct declaration, or synthesized
    808     // properties).
    809     //
    810     // FIXME: This should really be asserting this:
    811     //   (isa<ObjCCategoryDecl>(DC) &&
    812     //    cast<ObjCCategoryDecl>(DC)->IsClassExtension()))
    813     // but unfortunately we sometimes place ivars into non-class extension
    814     // categories on error. This breaks an AST invariant, and should not be
    815     // fixed.
    816     assert((isa<ObjCInterfaceDecl>(DC) || isa<ObjCImplementationDecl>(DC) ||
    817             isa<ObjCCategoryDecl>(DC)) &&
    818            "Invalid ivar decl context!");
    819     // Once a new ivar is created in any of class/class-extension/implementation
    820     // decl contexts, the previously built IvarList must be rebuilt.
    821     ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(DC);
    822     if (!ID) {
    823       if (ObjCImplementationDecl *IM = dyn_cast<ObjCImplementationDecl>(DC)) {
    824         ID = IM->getClassInterface();
    825         if (BW)
    826           IM->setHasSynthBitfield(true);
    827       } else {
    828         ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(DC);
    829         ID = CD->getClassInterface();
    830         if (BW)
    831           CD->setHasSynthBitfield(true);
    832       }
    833     }
    834     ID->setIvarList(0);
    835   }
    836 
    837   return new (C) ObjCIvarDecl(DC, StartLoc, IdLoc, Id, T, TInfo,
    838                               ac, BW, synthesized);
    839 }
    840 
    841 const ObjCInterfaceDecl *ObjCIvarDecl::getContainingInterface() const {
    842   const ObjCContainerDecl *DC = cast<ObjCContainerDecl>(getDeclContext());
    843 
    844   switch (DC->getKind()) {
    845   default:
    846   case ObjCCategoryImpl:
    847   case ObjCProtocol:
    848     llvm_unreachable("invalid ivar container!");
    849 
    850     // Ivars can only appear in class extension categories.
    851   case ObjCCategory: {
    852     const ObjCCategoryDecl *CD = cast<ObjCCategoryDecl>(DC);
    853     assert(CD->IsClassExtension() && "invalid container for ivar!");
    854     return CD->getClassInterface();
    855   }
    856 
    857   case ObjCImplementation:
    858     return cast<ObjCImplementationDecl>(DC)->getClassInterface();
    859 
    860   case ObjCInterface:
    861     return cast<ObjCInterfaceDecl>(DC);
    862   }
    863 }
    864 
    865 //===----------------------------------------------------------------------===//
    866 // ObjCAtDefsFieldDecl
    867 //===----------------------------------------------------------------------===//
    868 
    869 ObjCAtDefsFieldDecl
    870 *ObjCAtDefsFieldDecl::Create(ASTContext &C, DeclContext *DC,
    871                              SourceLocation StartLoc,  SourceLocation IdLoc,
    872                              IdentifierInfo *Id, QualType T, Expr *BW) {
    873   return new (C) ObjCAtDefsFieldDecl(DC, StartLoc, IdLoc, Id, T, BW);
    874 }
    875 
    876 //===----------------------------------------------------------------------===//
    877 // ObjCProtocolDecl
    878 //===----------------------------------------------------------------------===//
    879 
    880 ObjCProtocolDecl *ObjCProtocolDecl::Create(ASTContext &C, DeclContext *DC,
    881                                            IdentifierInfo *Id,
    882                                            SourceLocation nameLoc,
    883                                            SourceLocation atStartLoc,
    884                                            bool isForwardDecl) {
    885   return new (C) ObjCProtocolDecl(DC, Id, nameLoc, atStartLoc, isForwardDecl);
    886 }
    887 
    888 ObjCProtocolDecl *ObjCProtocolDecl::lookupProtocolNamed(IdentifierInfo *Name) {
    889   ObjCProtocolDecl *PDecl = this;
    890 
    891   if (Name == getIdentifier())
    892     return PDecl;
    893 
    894   for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
    895     if ((PDecl = (*I)->lookupProtocolNamed(Name)))
    896       return PDecl;
    897 
    898   return NULL;
    899 }
    900 
    901 // lookupMethod - Lookup a instance/class method in the protocol and protocols
    902 // it inherited.
    903 ObjCMethodDecl *ObjCProtocolDecl::lookupMethod(Selector Sel,
    904                                                bool isInstance) const {
    905   ObjCMethodDecl *MethodDecl = NULL;
    906 
    907   if ((MethodDecl = getMethod(Sel, isInstance)))
    908     return MethodDecl;
    909 
    910   for (protocol_iterator I = protocol_begin(), E = protocol_end(); I != E; ++I)
    911     if ((MethodDecl = (*I)->lookupMethod(Sel, isInstance)))
    912       return MethodDecl;
    913   return NULL;
    914 }
    915 
    916 //===----------------------------------------------------------------------===//
    917 // ObjCClassDecl
    918 //===----------------------------------------------------------------------===//
    919 
    920 ObjCClassDecl::ObjCClassDecl(DeclContext *DC, SourceLocation L,
    921                              ObjCInterfaceDecl *const Elt,
    922                              const SourceLocation Loc,
    923                              ASTContext &C)
    924   : Decl(ObjCClass, DC, L) {
    925   setClass(C, Elt, Loc);
    926 }
    927 
    928 ObjCClassDecl *ObjCClassDecl::Create(ASTContext &C, DeclContext *DC,
    929                                      SourceLocation L,
    930                                      ObjCInterfaceDecl *const Elt,
    931                                      const SourceLocation Loc) {
    932   return new (C) ObjCClassDecl(DC, L, Elt, Loc, C);
    933 }
    934 
    935 void ObjCClassDecl::setClass(ASTContext &C, ObjCInterfaceDecl*const Cls,
    936                              const SourceLocation Loc) {
    937 
    938   ForwardDecl = (ObjCClassRef*) C.Allocate(sizeof(ObjCClassRef),
    939                                            llvm::alignOf<ObjCClassRef>());
    940   new (ForwardDecl) ObjCClassRef(Cls, Loc);
    941 }
    942 
    943 SourceRange ObjCClassDecl::getSourceRange() const {
    944   // FIXME: We should include the semicolon
    945   return SourceRange(getLocation(), ForwardDecl->getLocation());
    946 }
    947 
    948 //===----------------------------------------------------------------------===//
    949 // ObjCForwardProtocolDecl
    950 //===----------------------------------------------------------------------===//
    951 
    952 ObjCForwardProtocolDecl::
    953 ObjCForwardProtocolDecl(DeclContext *DC, SourceLocation L,
    954                         ObjCProtocolDecl *const *Elts, unsigned nElts,
    955                         const SourceLocation *Locs, ASTContext &C)
    956 : Decl(ObjCForwardProtocol, DC, L) {
    957   ReferencedProtocols.set(Elts, nElts, Locs, C);
    958 }
    959 
    960 
    961 ObjCForwardProtocolDecl *
    962 ObjCForwardProtocolDecl::Create(ASTContext &C, DeclContext *DC,
    963                                 SourceLocation L,
    964                                 ObjCProtocolDecl *const *Elts,
    965                                 unsigned NumElts,
    966                                 const SourceLocation *Locs) {
    967   return new (C) ObjCForwardProtocolDecl(DC, L, Elts, NumElts, Locs, C);
    968 }
    969 
    970 //===----------------------------------------------------------------------===//
    971 // ObjCCategoryDecl
    972 //===----------------------------------------------------------------------===//
    973 
    974 ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, DeclContext *DC,
    975                                            SourceLocation AtLoc,
    976                                            SourceLocation ClassNameLoc,
    977                                            SourceLocation CategoryNameLoc,
    978                                            IdentifierInfo *Id,
    979                                            ObjCInterfaceDecl *IDecl) {
    980   ObjCCategoryDecl *CatDecl = new (C) ObjCCategoryDecl(DC, AtLoc, ClassNameLoc,
    981                                                        CategoryNameLoc, Id,
    982                                                        IDecl);
    983   if (IDecl) {
    984     // Link this category into its class's category list.
    985     CatDecl->NextClassCategory = IDecl->getCategoryList();
    986     IDecl->setCategoryList(CatDecl);
    987     if (ASTMutationListener *L = C.getASTMutationListener())
    988       L->AddedObjCCategoryToInterface(CatDecl, IDecl);
    989   }
    990 
    991   return CatDecl;
    992 }
    993 
    994 ObjCCategoryDecl *ObjCCategoryDecl::Create(ASTContext &C, EmptyShell Empty) {
    995   return new (C) ObjCCategoryDecl(0, SourceLocation(), SourceLocation(),
    996                                   SourceLocation(), 0, 0);
    997 }
    998 
    999 ObjCCategoryImplDecl *ObjCCategoryDecl::getImplementation() const {
   1000   return getASTContext().getObjCImplementation(
   1001                                            const_cast<ObjCCategoryDecl*>(this));
   1002 }
   1003 
   1004 void ObjCCategoryDecl::setImplementation(ObjCCategoryImplDecl *ImplD) {
   1005   getASTContext().setObjCImplementation(this, ImplD);
   1006 }
   1007 
   1008 
   1009 //===----------------------------------------------------------------------===//
   1010 // ObjCCategoryImplDecl
   1011 //===----------------------------------------------------------------------===//
   1012 
   1013 ObjCCategoryImplDecl *
   1014 ObjCCategoryImplDecl::Create(ASTContext &C, DeclContext *DC,
   1015                              IdentifierInfo *Id,
   1016                              ObjCInterfaceDecl *ClassInterface,
   1017                              SourceLocation nameLoc,
   1018                              SourceLocation atStartLoc) {
   1019   return new (C) ObjCCategoryImplDecl(DC, Id, ClassInterface,
   1020                                       nameLoc, atStartLoc);
   1021 }
   1022 
   1023 ObjCCategoryDecl *ObjCCategoryImplDecl::getCategoryDecl() const {
   1024   // The class interface might be NULL if we are working with invalid code.
   1025   if (const ObjCInterfaceDecl *ID = getClassInterface())
   1026     return ID->FindCategoryDeclaration(getIdentifier());
   1027   return 0;
   1028 }
   1029 
   1030 
   1031 void ObjCImplDecl::addPropertyImplementation(ObjCPropertyImplDecl *property) {
   1032   // FIXME: The context should be correct before we get here.
   1033   property->setLexicalDeclContext(this);
   1034   addDecl(property);
   1035 }
   1036 
   1037 void ObjCImplDecl::setClassInterface(ObjCInterfaceDecl *IFace) {
   1038   ASTContext &Ctx = getASTContext();
   1039 
   1040   if (ObjCImplementationDecl *ImplD
   1041         = dyn_cast_or_null<ObjCImplementationDecl>(this)) {
   1042     if (IFace)
   1043       Ctx.setObjCImplementation(IFace, ImplD);
   1044 
   1045   } else if (ObjCCategoryImplDecl *ImplD =
   1046              dyn_cast_or_null<ObjCCategoryImplDecl>(this)) {
   1047     if (ObjCCategoryDecl *CD = IFace->FindCategoryDeclaration(getIdentifier()))
   1048       Ctx.setObjCImplementation(CD, ImplD);
   1049   }
   1050 
   1051   ClassInterface = IFace;
   1052 }
   1053 
   1054 /// FindPropertyImplIvarDecl - This method lookup the ivar in the list of
   1055 /// properties implemented in this category @implementation block and returns
   1056 /// the implemented property that uses it.
   1057 ///
   1058 ObjCPropertyImplDecl *ObjCImplDecl::
   1059 FindPropertyImplIvarDecl(IdentifierInfo *ivarId) const {
   1060   for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
   1061     ObjCPropertyImplDecl *PID = *i;
   1062     if (PID->getPropertyIvarDecl() &&
   1063         PID->getPropertyIvarDecl()->getIdentifier() == ivarId)
   1064       return PID;
   1065   }
   1066   return 0;
   1067 }
   1068 
   1069 /// FindPropertyImplDecl - This method looks up a previous ObjCPropertyImplDecl
   1070 /// added to the list of those properties @synthesized/@dynamic in this
   1071 /// category @implementation block.
   1072 ///
   1073 ObjCPropertyImplDecl *ObjCImplDecl::
   1074 FindPropertyImplDecl(IdentifierInfo *Id) const {
   1075   for (propimpl_iterator i = propimpl_begin(), e = propimpl_end(); i != e; ++i){
   1076     ObjCPropertyImplDecl *PID = *i;
   1077     if (PID->getPropertyDecl()->getIdentifier() == Id)
   1078       return PID;
   1079   }
   1080   return 0;
   1081 }
   1082 
   1083 raw_ostream &clang::operator<<(raw_ostream &OS,
   1084                                      const ObjCCategoryImplDecl *CID) {
   1085   OS << CID->getName();
   1086   return OS;
   1087 }
   1088 
   1089 //===----------------------------------------------------------------------===//
   1090 // ObjCImplementationDecl
   1091 //===----------------------------------------------------------------------===//
   1092 
   1093 ObjCImplementationDecl *
   1094 ObjCImplementationDecl::Create(ASTContext &C, DeclContext *DC,
   1095                                ObjCInterfaceDecl *ClassInterface,
   1096                                ObjCInterfaceDecl *SuperDecl,
   1097                                SourceLocation nameLoc,
   1098                                SourceLocation atStartLoc) {
   1099   return new (C) ObjCImplementationDecl(DC, ClassInterface, SuperDecl,
   1100                                         nameLoc, atStartLoc);
   1101 }
   1102 
   1103 void ObjCImplementationDecl::setIvarInitializers(ASTContext &C,
   1104                                              CXXCtorInitializer ** initializers,
   1105                                                  unsigned numInitializers) {
   1106   if (numInitializers > 0) {
   1107     NumIvarInitializers = numInitializers;
   1108     CXXCtorInitializer **ivarInitializers =
   1109     new (C) CXXCtorInitializer*[NumIvarInitializers];
   1110     memcpy(ivarInitializers, initializers,
   1111            numInitializers * sizeof(CXXCtorInitializer*));
   1112     IvarInitializers = ivarInitializers;
   1113   }
   1114 }
   1115 
   1116 raw_ostream &clang::operator<<(raw_ostream &OS,
   1117                                      const ObjCImplementationDecl *ID) {
   1118   OS << ID->getName();
   1119   return OS;
   1120 }
   1121 
   1122 //===----------------------------------------------------------------------===//
   1123 // ObjCCompatibleAliasDecl
   1124 //===----------------------------------------------------------------------===//
   1125 
   1126 ObjCCompatibleAliasDecl *
   1127 ObjCCompatibleAliasDecl::Create(ASTContext &C, DeclContext *DC,
   1128                                 SourceLocation L,
   1129                                 IdentifierInfo *Id,
   1130                                 ObjCInterfaceDecl* AliasedClass) {
   1131   return new (C) ObjCCompatibleAliasDecl(DC, L, Id, AliasedClass);
   1132 }
   1133 
   1134 //===----------------------------------------------------------------------===//
   1135 // ObjCPropertyDecl
   1136 //===----------------------------------------------------------------------===//
   1137 
   1138 ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, DeclContext *DC,
   1139                                            SourceLocation L,
   1140                                            IdentifierInfo *Id,
   1141                                            SourceLocation AtLoc,
   1142                                            TypeSourceInfo *T,
   1143                                            PropertyControl propControl) {
   1144   return new (C) ObjCPropertyDecl(DC, L, Id, AtLoc, T);
   1145 }
   1146 
   1147 //===----------------------------------------------------------------------===//
   1148 // ObjCPropertyImplDecl
   1149 //===----------------------------------------------------------------------===//
   1150 
   1151 ObjCPropertyImplDecl *ObjCPropertyImplDecl::Create(ASTContext &C,
   1152                                                    DeclContext *DC,
   1153                                                    SourceLocation atLoc,
   1154                                                    SourceLocation L,
   1155                                                    ObjCPropertyDecl *property,
   1156                                                    Kind PK,
   1157                                                    ObjCIvarDecl *ivar,
   1158                                                    SourceLocation ivarLoc) {
   1159   return new (C) ObjCPropertyImplDecl(DC, atLoc, L, property, PK, ivar,
   1160                                       ivarLoc);
   1161 }
   1162 
   1163 SourceRange ObjCPropertyImplDecl::getSourceRange() const {
   1164   SourceLocation EndLoc = getLocation();
   1165   if (IvarLoc.isValid())
   1166     EndLoc = IvarLoc;
   1167 
   1168   return SourceRange(AtLoc, EndLoc);
   1169 }
   1170