SemaDeclObjC.cpp revision 2112190efa85f50af84a3c4efe03c5bf69247ba2
1//===--- SemaDeclObjC.cpp - Semantic Analysis for ObjC Declarations -------===//
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 semantic analysis for Objective C declarations.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Sema/SemaInternal.h"
15#include "clang/Sema/Lookup.h"
16#include "clang/Sema/ExternalSemaSource.h"
17#include "clang/Sema/Scope.h"
18#include "clang/Sema/ScopeInfo.h"
19#include "clang/AST/ASTConsumer.h"
20#include "clang/AST/Expr.h"
21#include "clang/AST/ExprObjC.h"
22#include "clang/AST/ASTContext.h"
23#include "clang/AST/DeclObjC.h"
24#include "clang/Basic/SourceManager.h"
25#include "clang/Sema/DeclSpec.h"
26#include "llvm/ADT/DenseSet.h"
27
28using namespace clang;
29
30/// Check whether the given method, which must be in the 'init'
31/// family, is a valid member of that family.
32///
33/// \param receiverTypeIfCall - if null, check this as if declaring it;
34///   if non-null, check this as if making a call to it with the given
35///   receiver type
36///
37/// \return true to indicate that there was an error and appropriate
38///   actions were taken
39bool Sema::checkInitMethod(ObjCMethodDecl *method,
40                           QualType receiverTypeIfCall) {
41  if (method->isInvalidDecl()) return true;
42
43  // This castAs is safe: methods that don't return an object
44  // pointer won't be inferred as inits and will reject an explicit
45  // objc_method_family(init).
46
47  // We ignore protocols here.  Should we?  What about Class?
48
49  const ObjCObjectType *result = method->getResultType()
50    ->castAs<ObjCObjectPointerType>()->getObjectType();
51
52  if (result->isObjCId()) {
53    return false;
54  } else if (result->isObjCClass()) {
55    // fall through: always an error
56  } else {
57    ObjCInterfaceDecl *resultClass = result->getInterface();
58    assert(resultClass && "unexpected object type!");
59
60    // It's okay for the result type to still be a forward declaration
61    // if we're checking an interface declaration.
62    if (resultClass->isForwardDecl()) {
63      if (receiverTypeIfCall.isNull() &&
64          !isa<ObjCImplementationDecl>(method->getDeclContext()))
65        return false;
66
67    // Otherwise, we try to compare class types.
68    } else {
69      // If this method was declared in a protocol, we can't check
70      // anything unless we have a receiver type that's an interface.
71      const ObjCInterfaceDecl *receiverClass = 0;
72      if (isa<ObjCProtocolDecl>(method->getDeclContext())) {
73        if (receiverTypeIfCall.isNull())
74          return false;
75
76        receiverClass = receiverTypeIfCall->castAs<ObjCObjectPointerType>()
77          ->getInterfaceDecl();
78
79        // This can be null for calls to e.g. id<Foo>.
80        if (!receiverClass) return false;
81      } else {
82        receiverClass = method->getClassInterface();
83        assert(receiverClass && "method not associated with a class!");
84      }
85
86      // If either class is a subclass of the other, it's fine.
87      if (receiverClass->isSuperClassOf(resultClass) ||
88          resultClass->isSuperClassOf(receiverClass))
89        return false;
90    }
91  }
92
93  SourceLocation loc = method->getLocation();
94
95  // If we're in a system header, and this is not a call, just make
96  // the method unusable.
97  if (receiverTypeIfCall.isNull() && getSourceManager().isInSystemHeader(loc)) {
98    method->addAttr(new (Context) UnavailableAttr(loc, Context,
99                "init method returns a type unrelated to its receiver type"));
100    return true;
101  }
102
103  // Otherwise, it's an error.
104  Diag(loc, diag::err_arc_init_method_unrelated_result_type);
105  method->setInvalidDecl();
106  return true;
107}
108
109bool Sema::CheckObjCMethodOverride(ObjCMethodDecl *NewMethod,
110                                   const ObjCMethodDecl *Overridden,
111                                   bool IsImplementation) {
112  if (Overridden->hasRelatedResultType() &&
113      !NewMethod->hasRelatedResultType()) {
114    // This can only happen when the method follows a naming convention that
115    // implies a related result type, and the original (overridden) method has
116    // a suitable return type, but the new (overriding) method does not have
117    // a suitable return type.
118    QualType ResultType = NewMethod->getResultType();
119    SourceRange ResultTypeRange;
120    if (const TypeSourceInfo *ResultTypeInfo
121                                        = NewMethod->getResultTypeSourceInfo())
122      ResultTypeRange = ResultTypeInfo->getTypeLoc().getSourceRange();
123
124    // Figure out which class this method is part of, if any.
125    ObjCInterfaceDecl *CurrentClass
126      = dyn_cast<ObjCInterfaceDecl>(NewMethod->getDeclContext());
127    if (!CurrentClass) {
128      DeclContext *DC = NewMethod->getDeclContext();
129      if (ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(DC))
130        CurrentClass = Cat->getClassInterface();
131      else if (ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(DC))
132        CurrentClass = Impl->getClassInterface();
133      else if (ObjCCategoryImplDecl *CatImpl
134               = dyn_cast<ObjCCategoryImplDecl>(DC))
135        CurrentClass = CatImpl->getClassInterface();
136    }
137
138    if (CurrentClass) {
139      Diag(NewMethod->getLocation(),
140           diag::warn_related_result_type_compatibility_class)
141        << Context.getObjCInterfaceType(CurrentClass)
142        << ResultType
143        << ResultTypeRange;
144    } else {
145      Diag(NewMethod->getLocation(),
146           diag::warn_related_result_type_compatibility_protocol)
147        << ResultType
148        << ResultTypeRange;
149    }
150
151    Diag(Overridden->getLocation(), diag::note_related_result_type_overridden)
152      << Overridden->getMethodFamily();
153  }
154
155  return false;
156}
157
158/// \brief Check a method declaration for compatibility with the Objective-C
159/// ARC conventions.
160static bool CheckARCMethodDecl(Sema &S, ObjCMethodDecl *method) {
161  ObjCMethodFamily family = method->getMethodFamily();
162  switch (family) {
163  case OMF_None:
164  case OMF_dealloc:
165  case OMF_retain:
166  case OMF_release:
167  case OMF_autorelease:
168  case OMF_retainCount:
169  case OMF_self:
170  case OMF_performSelector:
171    return false;
172
173  case OMF_init:
174    // If the method doesn't obey the init rules, don't bother annotating it.
175    if (S.checkInitMethod(method, QualType()))
176      return true;
177
178    method->addAttr(new (S.Context) NSConsumesSelfAttr(SourceLocation(),
179                                                       S.Context));
180
181    // Don't add a second copy of this attribute, but otherwise don't
182    // let it be suppressed.
183    if (method->hasAttr<NSReturnsRetainedAttr>())
184      return false;
185    break;
186
187  case OMF_alloc:
188  case OMF_copy:
189  case OMF_mutableCopy:
190  case OMF_new:
191    if (method->hasAttr<NSReturnsRetainedAttr>() ||
192        method->hasAttr<NSReturnsNotRetainedAttr>() ||
193        method->hasAttr<NSReturnsAutoreleasedAttr>())
194      return false;
195    break;
196  }
197
198  method->addAttr(new (S.Context) NSReturnsRetainedAttr(SourceLocation(),
199                                                        S.Context));
200  return false;
201}
202
203static void DiagnoseObjCImplementedDeprecations(Sema &S,
204                                                NamedDecl *ND,
205                                                SourceLocation ImplLoc,
206                                                int select) {
207  if (ND && ND->isDeprecated()) {
208    S.Diag(ImplLoc, diag::warn_deprecated_def) << select;
209    if (select == 0)
210      S.Diag(ND->getLocation(), diag::note_method_declared_at);
211    else
212      S.Diag(ND->getLocation(), diag::note_previous_decl) << "class";
213  }
214}
215
216/// ActOnStartOfObjCMethodDef - This routine sets up parameters; invisible
217/// and user declared, in the method definition's AST.
218void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) {
219  assert(getCurMethodDecl() == 0 && "Method parsing confused");
220  ObjCMethodDecl *MDecl = dyn_cast_or_null<ObjCMethodDecl>(D);
221
222  // If we don't have a valid method decl, simply return.
223  if (!MDecl)
224    return;
225
226  // Allow the rest of sema to find private method decl implementations.
227  if (MDecl->isInstanceMethod())
228    AddInstanceMethodToGlobalPool(MDecl, true);
229  else
230    AddFactoryMethodToGlobalPool(MDecl, true);
231
232  // Allow all of Sema to see that we are entering a method definition.
233  PushDeclContext(FnBodyScope, MDecl);
234  PushFunctionScope();
235
236  // Create Decl objects for each parameter, entrring them in the scope for
237  // binding to their use.
238
239  // Insert the invisible arguments, self and _cmd!
240  MDecl->createImplicitParams(Context, MDecl->getClassInterface());
241
242  PushOnScopeChains(MDecl->getSelfDecl(), FnBodyScope);
243  PushOnScopeChains(MDecl->getCmdDecl(), FnBodyScope);
244
245  // Introduce all of the other parameters into this scope.
246  for (ObjCMethodDecl::param_iterator PI = MDecl->param_begin(),
247       E = MDecl->param_end(); PI != E; ++PI) {
248    ParmVarDecl *Param = (*PI);
249    if (!Param->isInvalidDecl() &&
250        RequireCompleteType(Param->getLocation(), Param->getType(),
251                            diag::err_typecheck_decl_incomplete_type))
252          Param->setInvalidDecl();
253    if ((*PI)->getIdentifier())
254      PushOnScopeChains(*PI, FnBodyScope);
255  }
256
257  // In ARC, disallow definition of retain/release/autorelease/retainCount
258  if (getLangOptions().ObjCAutoRefCount) {
259    switch (MDecl->getMethodFamily()) {
260    case OMF_retain:
261    case OMF_retainCount:
262    case OMF_release:
263    case OMF_autorelease:
264      Diag(MDecl->getLocation(), diag::err_arc_illegal_method_def)
265        << MDecl->getSelector();
266      break;
267
268    case OMF_None:
269    case OMF_dealloc:
270    case OMF_alloc:
271    case OMF_init:
272    case OMF_mutableCopy:
273    case OMF_copy:
274    case OMF_new:
275    case OMF_self:
276    case OMF_performSelector:
277      break;
278    }
279  }
280
281  // Warn on implementating deprecated methods under
282  // -Wdeprecated-implementations flag.
283  if (ObjCInterfaceDecl *IC = MDecl->getClassInterface())
284    if (ObjCMethodDecl *IMD =
285          IC->lookupMethod(MDecl->getSelector(), MDecl->isInstanceMethod()))
286      DiagnoseObjCImplementedDeprecations(*this,
287                                          dyn_cast<NamedDecl>(IMD),
288                                          MDecl->getLocation(), 0);
289}
290
291Decl *Sema::
292ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
293                         IdentifierInfo *ClassName, SourceLocation ClassLoc,
294                         IdentifierInfo *SuperName, SourceLocation SuperLoc,
295                         Decl * const *ProtoRefs, unsigned NumProtoRefs,
296                         const SourceLocation *ProtoLocs,
297                         SourceLocation EndProtoLoc, AttributeList *AttrList) {
298  assert(ClassName && "Missing class identifier");
299
300  // Check for another declaration kind with the same name.
301  NamedDecl *PrevDecl = LookupSingleName(TUScope, ClassName, ClassLoc,
302                                         LookupOrdinaryName, ForRedeclaration);
303
304  if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
305    Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
306    Diag(PrevDecl->getLocation(), diag::note_previous_definition);
307  }
308
309  ObjCInterfaceDecl* IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
310  if (IDecl) {
311    // Class already seen. Is it a forward declaration?
312    if (!IDecl->isForwardDecl()) {
313      IDecl->setInvalidDecl();
314      Diag(AtInterfaceLoc, diag::err_duplicate_class_def)<<IDecl->getDeclName();
315      Diag(IDecl->getLocation(), diag::note_previous_definition);
316
317      // Return the previous class interface.
318      // FIXME: don't leak the objects passed in!
319      return IDecl;
320    } else {
321      IDecl->setLocation(AtInterfaceLoc);
322      IDecl->setForwardDecl(false);
323      IDecl->setClassLoc(ClassLoc);
324      // If the forward decl was in a PCH, we need to write it again in a
325      // dependent AST file.
326      IDecl->setChangedSinceDeserialization(true);
327
328      // Since this ObjCInterfaceDecl was created by a forward declaration,
329      // we now add it to the DeclContext since it wasn't added before
330      // (see ActOnForwardClassDeclaration).
331      IDecl->setLexicalDeclContext(CurContext);
332      CurContext->addDecl(IDecl);
333
334      if (AttrList)
335        ProcessDeclAttributeList(TUScope, IDecl, AttrList);
336    }
337  } else {
338    IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtInterfaceLoc,
339                                      ClassName, ClassLoc);
340    if (AttrList)
341      ProcessDeclAttributeList(TUScope, IDecl, AttrList);
342
343    PushOnScopeChains(IDecl, TUScope);
344  }
345
346  if (SuperName) {
347    // Check if a different kind of symbol declared in this scope.
348    PrevDecl = LookupSingleName(TUScope, SuperName, SuperLoc,
349                                LookupOrdinaryName);
350
351    if (!PrevDecl) {
352      // Try to correct for a typo in the superclass name.
353      TypoCorrection Corrected = CorrectTypo(
354          DeclarationNameInfo(SuperName, SuperLoc), LookupOrdinaryName, TUScope,
355          NULL, NULL, false, CTC_NoKeywords);
356      if ((PrevDecl = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>())) {
357        Diag(SuperLoc, diag::err_undef_superclass_suggest)
358          << SuperName << ClassName << PrevDecl->getDeclName();
359        Diag(PrevDecl->getLocation(), diag::note_previous_decl)
360          << PrevDecl->getDeclName();
361      }
362    }
363
364    if (PrevDecl == IDecl) {
365      Diag(SuperLoc, diag::err_recursive_superclass)
366        << SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);
367      IDecl->setLocEnd(ClassLoc);
368    } else {
369      ObjCInterfaceDecl *SuperClassDecl =
370                                dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
371
372      // Diagnose classes that inherit from deprecated classes.
373      if (SuperClassDecl)
374        (void)DiagnoseUseOfDecl(SuperClassDecl, SuperLoc);
375
376      if (PrevDecl && SuperClassDecl == 0) {
377        // The previous declaration was not a class decl. Check if we have a
378        // typedef. If we do, get the underlying class type.
379        if (const TypedefNameDecl *TDecl =
380              dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
381          QualType T = TDecl->getUnderlyingType();
382          if (T->isObjCObjectType()) {
383            if (NamedDecl *IDecl = T->getAs<ObjCObjectType>()->getInterface())
384              SuperClassDecl = dyn_cast<ObjCInterfaceDecl>(IDecl);
385          }
386        }
387
388        // This handles the following case:
389        //
390        // typedef int SuperClass;
391        // @interface MyClass : SuperClass {} @end
392        //
393        if (!SuperClassDecl) {
394          Diag(SuperLoc, diag::err_redefinition_different_kind) << SuperName;
395          Diag(PrevDecl->getLocation(), diag::note_previous_definition);
396        }
397      }
398
399      if (!dyn_cast_or_null<TypedefNameDecl>(PrevDecl)) {
400        if (!SuperClassDecl)
401          Diag(SuperLoc, diag::err_undef_superclass)
402            << SuperName << ClassName << SourceRange(AtInterfaceLoc, ClassLoc);
403        else if (SuperClassDecl->isForwardDecl()) {
404          Diag(SuperLoc, diag::err_forward_superclass)
405            << SuperClassDecl->getDeclName() << ClassName
406            << SourceRange(AtInterfaceLoc, ClassLoc);
407          Diag(SuperClassDecl->getLocation(), diag::note_forward_class);
408          SuperClassDecl = 0;
409        }
410      }
411      IDecl->setSuperClass(SuperClassDecl);
412      IDecl->setSuperClassLoc(SuperLoc);
413      IDecl->setLocEnd(SuperLoc);
414    }
415  } else { // we have a root class.
416    IDecl->setLocEnd(ClassLoc);
417  }
418
419  // Check then save referenced protocols.
420  if (NumProtoRefs) {
421    IDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
422                           ProtoLocs, Context);
423    IDecl->setLocEnd(EndProtoLoc);
424  }
425
426  CheckObjCDeclScope(IDecl);
427  return IDecl;
428}
429
430/// ActOnCompatiblityAlias - this action is called after complete parsing of
431/// @compatibility_alias declaration. It sets up the alias relationships.
432Decl *Sema::ActOnCompatiblityAlias(SourceLocation AtLoc,
433                                        IdentifierInfo *AliasName,
434                                        SourceLocation AliasLocation,
435                                        IdentifierInfo *ClassName,
436                                        SourceLocation ClassLocation) {
437  // Look for previous declaration of alias name
438  NamedDecl *ADecl = LookupSingleName(TUScope, AliasName, AliasLocation,
439                                      LookupOrdinaryName, ForRedeclaration);
440  if (ADecl) {
441    if (isa<ObjCCompatibleAliasDecl>(ADecl))
442      Diag(AliasLocation, diag::warn_previous_alias_decl);
443    else
444      Diag(AliasLocation, diag::err_conflicting_aliasing_type) << AliasName;
445    Diag(ADecl->getLocation(), diag::note_previous_declaration);
446    return 0;
447  }
448  // Check for class declaration
449  NamedDecl *CDeclU = LookupSingleName(TUScope, ClassName, ClassLocation,
450                                       LookupOrdinaryName, ForRedeclaration);
451  if (const TypedefNameDecl *TDecl =
452        dyn_cast_or_null<TypedefNameDecl>(CDeclU)) {
453    QualType T = TDecl->getUnderlyingType();
454    if (T->isObjCObjectType()) {
455      if (NamedDecl *IDecl = T->getAs<ObjCObjectType>()->getInterface()) {
456        ClassName = IDecl->getIdentifier();
457        CDeclU = LookupSingleName(TUScope, ClassName, ClassLocation,
458                                  LookupOrdinaryName, ForRedeclaration);
459      }
460    }
461  }
462  ObjCInterfaceDecl *CDecl = dyn_cast_or_null<ObjCInterfaceDecl>(CDeclU);
463  if (CDecl == 0) {
464    Diag(ClassLocation, diag::warn_undef_interface) << ClassName;
465    if (CDeclU)
466      Diag(CDeclU->getLocation(), diag::note_previous_declaration);
467    return 0;
468  }
469
470  // Everything checked out, instantiate a new alias declaration AST.
471  ObjCCompatibleAliasDecl *AliasDecl =
472    ObjCCompatibleAliasDecl::Create(Context, CurContext, AtLoc, AliasName, CDecl);
473
474  if (!CheckObjCDeclScope(AliasDecl))
475    PushOnScopeChains(AliasDecl, TUScope);
476
477  return AliasDecl;
478}
479
480bool Sema::CheckForwardProtocolDeclarationForCircularDependency(
481  IdentifierInfo *PName,
482  SourceLocation &Ploc, SourceLocation PrevLoc,
483  const ObjCList<ObjCProtocolDecl> &PList) {
484
485  bool res = false;
486  for (ObjCList<ObjCProtocolDecl>::iterator I = PList.begin(),
487       E = PList.end(); I != E; ++I) {
488    if (ObjCProtocolDecl *PDecl = LookupProtocol((*I)->getIdentifier(),
489                                                 Ploc)) {
490      if (PDecl->getIdentifier() == PName) {
491        Diag(Ploc, diag::err_protocol_has_circular_dependency);
492        Diag(PrevLoc, diag::note_previous_definition);
493        res = true;
494      }
495      if (CheckForwardProtocolDeclarationForCircularDependency(PName, Ploc,
496            PDecl->getLocation(), PDecl->getReferencedProtocols()))
497        res = true;
498    }
499  }
500  return res;
501}
502
503Decl *
504Sema::ActOnStartProtocolInterface(SourceLocation AtProtoInterfaceLoc,
505                                  IdentifierInfo *ProtocolName,
506                                  SourceLocation ProtocolLoc,
507                                  Decl * const *ProtoRefs,
508                                  unsigned NumProtoRefs,
509                                  const SourceLocation *ProtoLocs,
510                                  SourceLocation EndProtoLoc,
511                                  AttributeList *AttrList) {
512  bool err = false;
513  // FIXME: Deal with AttrList.
514  assert(ProtocolName && "Missing protocol identifier");
515  ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolName, ProtocolLoc);
516  if (PDecl) {
517    // Protocol already seen. Better be a forward protocol declaration
518    if (!PDecl->isForwardDecl()) {
519      Diag(ProtocolLoc, diag::warn_duplicate_protocol_def) << ProtocolName;
520      Diag(PDecl->getLocation(), diag::note_previous_definition);
521      // Just return the protocol we already had.
522      // FIXME: don't leak the objects passed in!
523      return PDecl;
524    }
525    ObjCList<ObjCProtocolDecl> PList;
526    PList.set((ObjCProtocolDecl *const*)ProtoRefs, NumProtoRefs, Context);
527    err = CheckForwardProtocolDeclarationForCircularDependency(
528            ProtocolName, ProtocolLoc, PDecl->getLocation(), PList);
529
530    // Make sure the cached decl gets a valid start location.
531    PDecl->setLocation(AtProtoInterfaceLoc);
532    PDecl->setForwardDecl(false);
533    CurContext->addDecl(PDecl);
534    // Repeat in dependent AST files.
535    PDecl->setChangedSinceDeserialization(true);
536  } else {
537    PDecl = ObjCProtocolDecl::Create(Context, CurContext,
538                                     AtProtoInterfaceLoc,ProtocolName);
539    PushOnScopeChains(PDecl, TUScope);
540    PDecl->setForwardDecl(false);
541  }
542  if (AttrList)
543    ProcessDeclAttributeList(TUScope, PDecl, AttrList);
544  if (!err && NumProtoRefs ) {
545    /// Check then save referenced protocols.
546    PDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
547                           ProtoLocs, Context);
548    PDecl->setLocEnd(EndProtoLoc);
549  }
550
551  CheckObjCDeclScope(PDecl);
552  return PDecl;
553}
554
555/// FindProtocolDeclaration - This routine looks up protocols and
556/// issues an error if they are not declared. It returns list of
557/// protocol declarations in its 'Protocols' argument.
558void
559Sema::FindProtocolDeclaration(bool WarnOnDeclarations,
560                              const IdentifierLocPair *ProtocolId,
561                              unsigned NumProtocols,
562                              SmallVectorImpl<Decl *> &Protocols) {
563  for (unsigned i = 0; i != NumProtocols; ++i) {
564    ObjCProtocolDecl *PDecl = LookupProtocol(ProtocolId[i].first,
565                                             ProtocolId[i].second);
566    if (!PDecl) {
567      TypoCorrection Corrected = CorrectTypo(
568          DeclarationNameInfo(ProtocolId[i].first, ProtocolId[i].second),
569          LookupObjCProtocolName, TUScope, NULL, NULL, false, CTC_NoKeywords);
570      if ((PDecl = Corrected.getCorrectionDeclAs<ObjCProtocolDecl>())) {
571        Diag(ProtocolId[i].second, diag::err_undeclared_protocol_suggest)
572          << ProtocolId[i].first << Corrected.getCorrection();
573        Diag(PDecl->getLocation(), diag::note_previous_decl)
574          << PDecl->getDeclName();
575      }
576    }
577
578    if (!PDecl) {
579      Diag(ProtocolId[i].second, diag::err_undeclared_protocol)
580        << ProtocolId[i].first;
581      continue;
582    }
583
584    (void)DiagnoseUseOfDecl(PDecl, ProtocolId[i].second);
585
586    // If this is a forward declaration and we are supposed to warn in this
587    // case, do it.
588    if (WarnOnDeclarations && PDecl->isForwardDecl())
589      Diag(ProtocolId[i].second, diag::warn_undef_protocolref)
590        << ProtocolId[i].first;
591    Protocols.push_back(PDecl);
592  }
593}
594
595/// DiagnoseClassExtensionDupMethods - Check for duplicate declaration of
596/// a class method in its extension.
597///
598void Sema::DiagnoseClassExtensionDupMethods(ObjCCategoryDecl *CAT,
599                                            ObjCInterfaceDecl *ID) {
600  if (!ID)
601    return;  // Possibly due to previous error
602
603  llvm::DenseMap<Selector, const ObjCMethodDecl*> MethodMap;
604  for (ObjCInterfaceDecl::method_iterator i = ID->meth_begin(),
605       e =  ID->meth_end(); i != e; ++i) {
606    ObjCMethodDecl *MD = *i;
607    MethodMap[MD->getSelector()] = MD;
608  }
609
610  if (MethodMap.empty())
611    return;
612  for (ObjCCategoryDecl::method_iterator i = CAT->meth_begin(),
613       e =  CAT->meth_end(); i != e; ++i) {
614    ObjCMethodDecl *Method = *i;
615    const ObjCMethodDecl *&PrevMethod = MethodMap[Method->getSelector()];
616    if (PrevMethod && !MatchTwoMethodDeclarations(Method, PrevMethod)) {
617      Diag(Method->getLocation(), diag::err_duplicate_method_decl)
618            << Method->getDeclName();
619      Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
620    }
621  }
622}
623
624/// ActOnForwardProtocolDeclaration - Handle @protocol foo;
625Decl *
626Sema::ActOnForwardProtocolDeclaration(SourceLocation AtProtocolLoc,
627                                      const IdentifierLocPair *IdentList,
628                                      unsigned NumElts,
629                                      AttributeList *attrList) {
630  SmallVector<ObjCProtocolDecl*, 32> Protocols;
631  SmallVector<SourceLocation, 8> ProtoLocs;
632
633  for (unsigned i = 0; i != NumElts; ++i) {
634    IdentifierInfo *Ident = IdentList[i].first;
635    ObjCProtocolDecl *PDecl = LookupProtocol(Ident, IdentList[i].second);
636    bool isNew = false;
637    if (PDecl == 0) { // Not already seen?
638      PDecl = ObjCProtocolDecl::Create(Context, CurContext,
639                                       IdentList[i].second, Ident);
640      PushOnScopeChains(PDecl, TUScope, false);
641      isNew = true;
642    }
643    if (attrList) {
644      ProcessDeclAttributeList(TUScope, PDecl, attrList);
645      if (!isNew)
646        PDecl->setChangedSinceDeserialization(true);
647    }
648    Protocols.push_back(PDecl);
649    ProtoLocs.push_back(IdentList[i].second);
650  }
651
652  ObjCForwardProtocolDecl *PDecl =
653    ObjCForwardProtocolDecl::Create(Context, CurContext, AtProtocolLoc,
654                                    Protocols.data(), Protocols.size(),
655                                    ProtoLocs.data());
656  CurContext->addDecl(PDecl);
657  CheckObjCDeclScope(PDecl);
658  return PDecl;
659}
660
661Decl *Sema::
662ActOnStartCategoryInterface(SourceLocation AtInterfaceLoc,
663                            IdentifierInfo *ClassName, SourceLocation ClassLoc,
664                            IdentifierInfo *CategoryName,
665                            SourceLocation CategoryLoc,
666                            Decl * const *ProtoRefs,
667                            unsigned NumProtoRefs,
668                            const SourceLocation *ProtoLocs,
669                            SourceLocation EndProtoLoc) {
670  ObjCCategoryDecl *CDecl;
671  ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName, ClassLoc, true);
672
673  /// Check that class of this category is already completely declared.
674  if (!IDecl || IDecl->isForwardDecl()) {
675    // Create an invalid ObjCCategoryDecl to serve as context for
676    // the enclosing method declarations.  We mark the decl invalid
677    // to make it clear that this isn't a valid AST.
678    CDecl = ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc,
679                                     ClassLoc, CategoryLoc, CategoryName);
680    CDecl->setInvalidDecl();
681    Diag(ClassLoc, diag::err_undef_interface) << ClassName;
682    return CDecl;
683  }
684
685  if (!CategoryName && IDecl->getImplementation()) {
686    Diag(ClassLoc, diag::err_class_extension_after_impl) << ClassName;
687    Diag(IDecl->getImplementation()->getLocation(),
688          diag::note_implementation_declared);
689  }
690
691  CDecl = ObjCCategoryDecl::Create(Context, CurContext, AtInterfaceLoc,
692                                   ClassLoc, CategoryLoc, CategoryName);
693  // FIXME: PushOnScopeChains?
694  CurContext->addDecl(CDecl);
695
696  CDecl->setClassInterface(IDecl);
697  // Insert class extension to the list of class's categories.
698  if (!CategoryName)
699    CDecl->insertNextClassCategory();
700
701  // If the interface is deprecated, warn about it.
702  (void)DiagnoseUseOfDecl(IDecl, ClassLoc);
703
704  if (CategoryName) {
705    /// Check for duplicate interface declaration for this category
706    ObjCCategoryDecl *CDeclChain;
707    for (CDeclChain = IDecl->getCategoryList(); CDeclChain;
708         CDeclChain = CDeclChain->getNextClassCategory()) {
709      if (CDeclChain->getIdentifier() == CategoryName) {
710        // Class extensions can be declared multiple times.
711        Diag(CategoryLoc, diag::warn_dup_category_def)
712          << ClassName << CategoryName;
713        Diag(CDeclChain->getLocation(), diag::note_previous_definition);
714        break;
715      }
716    }
717    if (!CDeclChain)
718      CDecl->insertNextClassCategory();
719  }
720
721  if (NumProtoRefs) {
722    CDecl->setProtocolList((ObjCProtocolDecl**)ProtoRefs, NumProtoRefs,
723                           ProtoLocs, Context);
724    // Protocols in the class extension belong to the class.
725    if (CDecl->IsClassExtension())
726     IDecl->mergeClassExtensionProtocolList((ObjCProtocolDecl**)ProtoRefs,
727                                            NumProtoRefs, Context);
728  }
729
730  CheckObjCDeclScope(CDecl);
731  return CDecl;
732}
733
734/// ActOnStartCategoryImplementation - Perform semantic checks on the
735/// category implementation declaration and build an ObjCCategoryImplDecl
736/// object.
737Decl *Sema::ActOnStartCategoryImplementation(
738                      SourceLocation AtCatImplLoc,
739                      IdentifierInfo *ClassName, SourceLocation ClassLoc,
740                      IdentifierInfo *CatName, SourceLocation CatLoc) {
741  ObjCInterfaceDecl *IDecl = getObjCInterfaceDecl(ClassName, ClassLoc, true);
742  ObjCCategoryDecl *CatIDecl = 0;
743  if (IDecl) {
744    CatIDecl = IDecl->FindCategoryDeclaration(CatName);
745    if (!CatIDecl) {
746      // Category @implementation with no corresponding @interface.
747      // Create and install one.
748      CatIDecl = ObjCCategoryDecl::Create(Context, CurContext, SourceLocation(),
749                                          SourceLocation(), SourceLocation(),
750                                          CatName);
751      CatIDecl->setClassInterface(IDecl);
752      CatIDecl->insertNextClassCategory();
753    }
754  }
755
756  ObjCCategoryImplDecl *CDecl =
757    ObjCCategoryImplDecl::Create(Context, CurContext, AtCatImplLoc, CatName,
758                                 IDecl);
759  /// Check that class of this category is already completely declared.
760  if (!IDecl || IDecl->isForwardDecl()) {
761    Diag(ClassLoc, diag::err_undef_interface) << ClassName;
762    CDecl->setInvalidDecl();
763  }
764
765  // FIXME: PushOnScopeChains?
766  CurContext->addDecl(CDecl);
767
768  /// Check that CatName, category name, is not used in another implementation.
769  if (CatIDecl) {
770    if (CatIDecl->getImplementation()) {
771      Diag(ClassLoc, diag::err_dup_implementation_category) << ClassName
772        << CatName;
773      Diag(CatIDecl->getImplementation()->getLocation(),
774           diag::note_previous_definition);
775    } else {
776      CatIDecl->setImplementation(CDecl);
777      // Warn on implementating category of deprecated class under
778      // -Wdeprecated-implementations flag.
779      DiagnoseObjCImplementedDeprecations(*this,
780                                          dyn_cast<NamedDecl>(IDecl),
781                                          CDecl->getLocation(), 2);
782    }
783  }
784
785  CheckObjCDeclScope(CDecl);
786  return CDecl;
787}
788
789Decl *Sema::ActOnStartClassImplementation(
790                      SourceLocation AtClassImplLoc,
791                      IdentifierInfo *ClassName, SourceLocation ClassLoc,
792                      IdentifierInfo *SuperClassname,
793                      SourceLocation SuperClassLoc) {
794  ObjCInterfaceDecl* IDecl = 0;
795  // Check for another declaration kind with the same name.
796  NamedDecl *PrevDecl
797    = LookupSingleName(TUScope, ClassName, ClassLoc, LookupOrdinaryName,
798                       ForRedeclaration);
799  if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
800    Diag(ClassLoc, diag::err_redefinition_different_kind) << ClassName;
801    Diag(PrevDecl->getLocation(), diag::note_previous_definition);
802  } else if ((IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl))) {
803    // If this is a forward declaration of an interface, warn.
804    if (IDecl->isForwardDecl()) {
805      Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
806      IDecl = 0;
807    }
808  } else {
809    // We did not find anything with the name ClassName; try to correct for
810    // typos in the class name.
811    TypoCorrection Corrected = CorrectTypo(
812        DeclarationNameInfo(ClassName, ClassLoc), LookupOrdinaryName, TUScope,
813        NULL, NULL, false, CTC_NoKeywords);
814    if ((IDecl = Corrected.getCorrectionDeclAs<ObjCInterfaceDecl>())) {
815      // Suggest the (potentially) correct interface name. However, put the
816      // fix-it hint itself in a separate note, since changing the name in
817      // the warning would make the fix-it change semantics.However, don't
818      // provide a code-modification hint or use the typo name for recovery,
819      // because this is just a warning. The program may actually be correct.
820      DeclarationName CorrectedName = Corrected.getCorrection();
821      Diag(ClassLoc, diag::warn_undef_interface_suggest)
822        << ClassName << CorrectedName;
823      Diag(IDecl->getLocation(), diag::note_previous_decl) << CorrectedName
824        << FixItHint::CreateReplacement(ClassLoc, CorrectedName.getAsString());
825      IDecl = 0;
826    } else {
827      Diag(ClassLoc, diag::warn_undef_interface) << ClassName;
828    }
829  }
830
831  // Check that super class name is valid class name
832  ObjCInterfaceDecl* SDecl = 0;
833  if (SuperClassname) {
834    // Check if a different kind of symbol declared in this scope.
835    PrevDecl = LookupSingleName(TUScope, SuperClassname, SuperClassLoc,
836                                LookupOrdinaryName);
837    if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
838      Diag(SuperClassLoc, diag::err_redefinition_different_kind)
839        << SuperClassname;
840      Diag(PrevDecl->getLocation(), diag::note_previous_definition);
841    } else {
842      SDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
843      if (!SDecl)
844        Diag(SuperClassLoc, diag::err_undef_superclass)
845          << SuperClassname << ClassName;
846      else if (IDecl && IDecl->getSuperClass() != SDecl) {
847        // This implementation and its interface do not have the same
848        // super class.
849        Diag(SuperClassLoc, diag::err_conflicting_super_class)
850          << SDecl->getDeclName();
851        Diag(SDecl->getLocation(), diag::note_previous_definition);
852      }
853    }
854  }
855
856  if (!IDecl) {
857    // Legacy case of @implementation with no corresponding @interface.
858    // Build, chain & install the interface decl into the identifier.
859
860    // FIXME: Do we support attributes on the @implementation? If so we should
861    // copy them over.
862    IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtClassImplLoc,
863                                      ClassName, ClassLoc, false, true);
864    IDecl->setSuperClass(SDecl);
865    IDecl->setLocEnd(ClassLoc);
866
867    PushOnScopeChains(IDecl, TUScope);
868  } else {
869    // Mark the interface as being completed, even if it was just as
870    //   @class ....;
871    // declaration; the user cannot reopen it.
872    IDecl->setForwardDecl(false);
873  }
874
875  ObjCImplementationDecl* IMPDecl =
876    ObjCImplementationDecl::Create(Context, CurContext, AtClassImplLoc,
877                                   IDecl, SDecl);
878
879  if (CheckObjCDeclScope(IMPDecl))
880    return IMPDecl;
881
882  // Check that there is no duplicate implementation of this class.
883  if (IDecl->getImplementation()) {
884    // FIXME: Don't leak everything!
885    Diag(ClassLoc, diag::err_dup_implementation_class) << ClassName;
886    Diag(IDecl->getImplementation()->getLocation(),
887         diag::note_previous_definition);
888  } else { // add it to the list.
889    IDecl->setImplementation(IMPDecl);
890    PushOnScopeChains(IMPDecl, TUScope);
891    // Warn on implementating deprecated class under
892    // -Wdeprecated-implementations flag.
893    DiagnoseObjCImplementedDeprecations(*this,
894                                        dyn_cast<NamedDecl>(IDecl),
895                                        IMPDecl->getLocation(), 1);
896  }
897  return IMPDecl;
898}
899
900void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
901                                    ObjCIvarDecl **ivars, unsigned numIvars,
902                                    SourceLocation RBrace) {
903  assert(ImpDecl && "missing implementation decl");
904  ObjCInterfaceDecl* IDecl = ImpDecl->getClassInterface();
905  if (!IDecl)
906    return;
907  /// Check case of non-existing @interface decl.
908  /// (legacy objective-c @implementation decl without an @interface decl).
909  /// Add implementations's ivar to the synthesize class's ivar list.
910  if (IDecl->isImplicitInterfaceDecl()) {
911    IDecl->setLocEnd(RBrace);
912    // Add ivar's to class's DeclContext.
913    for (unsigned i = 0, e = numIvars; i != e; ++i) {
914      ivars[i]->setLexicalDeclContext(ImpDecl);
915      IDecl->makeDeclVisibleInContext(ivars[i], false);
916      ImpDecl->addDecl(ivars[i]);
917    }
918
919    return;
920  }
921  // If implementation has empty ivar list, just return.
922  if (numIvars == 0)
923    return;
924
925  assert(ivars && "missing @implementation ivars");
926  if (LangOpts.ObjCNonFragileABI2) {
927    if (ImpDecl->getSuperClass())
928      Diag(ImpDecl->getLocation(), diag::warn_on_superclass_use);
929    for (unsigned i = 0; i < numIvars; i++) {
930      ObjCIvarDecl* ImplIvar = ivars[i];
931      if (const ObjCIvarDecl *ClsIvar =
932            IDecl->getIvarDecl(ImplIvar->getIdentifier())) {
933        Diag(ImplIvar->getLocation(), diag::err_duplicate_ivar_declaration);
934        Diag(ClsIvar->getLocation(), diag::note_previous_definition);
935        continue;
936      }
937      // Instance ivar to Implementation's DeclContext.
938      ImplIvar->setLexicalDeclContext(ImpDecl);
939      IDecl->makeDeclVisibleInContext(ImplIvar, false);
940      ImpDecl->addDecl(ImplIvar);
941    }
942    return;
943  }
944  // Check interface's Ivar list against those in the implementation.
945  // names and types must match.
946  //
947  unsigned j = 0;
948  ObjCInterfaceDecl::ivar_iterator
949    IVI = IDecl->ivar_begin(), IVE = IDecl->ivar_end();
950  for (; numIvars > 0 && IVI != IVE; ++IVI) {
951    ObjCIvarDecl* ImplIvar = ivars[j++];
952    ObjCIvarDecl* ClsIvar = *IVI;
953    assert (ImplIvar && "missing implementation ivar");
954    assert (ClsIvar && "missing class ivar");
955
956    // First, make sure the types match.
957    if (Context.getCanonicalType(ImplIvar->getType()) !=
958        Context.getCanonicalType(ClsIvar->getType())) {
959      Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_type)
960        << ImplIvar->getIdentifier()
961        << ImplIvar->getType() << ClsIvar->getType();
962      Diag(ClsIvar->getLocation(), diag::note_previous_definition);
963    } else if (ImplIvar->isBitField() && ClsIvar->isBitField()) {
964      Expr *ImplBitWidth = ImplIvar->getBitWidth();
965      Expr *ClsBitWidth = ClsIvar->getBitWidth();
966      if (ImplBitWidth->EvaluateAsInt(Context).getZExtValue() !=
967          ClsBitWidth->EvaluateAsInt(Context).getZExtValue()) {
968        Diag(ImplBitWidth->getLocStart(), diag::err_conflicting_ivar_bitwidth)
969          << ImplIvar->getIdentifier();
970        Diag(ClsBitWidth->getLocStart(), diag::note_previous_definition);
971      }
972    }
973    // Make sure the names are identical.
974    if (ImplIvar->getIdentifier() != ClsIvar->getIdentifier()) {
975      Diag(ImplIvar->getLocation(), diag::err_conflicting_ivar_name)
976        << ImplIvar->getIdentifier() << ClsIvar->getIdentifier();
977      Diag(ClsIvar->getLocation(), diag::note_previous_definition);
978    }
979    --numIvars;
980  }
981
982  if (numIvars > 0)
983    Diag(ivars[j]->getLocation(), diag::err_inconsistant_ivar_count);
984  else if (IVI != IVE)
985    Diag((*IVI)->getLocation(), diag::err_inconsistant_ivar_count);
986}
987
988void Sema::WarnUndefinedMethod(SourceLocation ImpLoc, ObjCMethodDecl *method,
989                               bool &IncompleteImpl, unsigned DiagID) {
990  // No point warning no definition of method which is 'unavailable'.
991  if (method->hasAttr<UnavailableAttr>())
992    return;
993  if (!IncompleteImpl) {
994    Diag(ImpLoc, diag::warn_incomplete_impl);
995    IncompleteImpl = true;
996  }
997  if (DiagID == diag::warn_unimplemented_protocol_method)
998    Diag(ImpLoc, DiagID) << method->getDeclName();
999  else
1000    Diag(method->getLocation(), DiagID) << method->getDeclName();
1001}
1002
1003/// Determines if type B can be substituted for type A.  Returns true if we can
1004/// guarantee that anything that the user will do to an object of type A can
1005/// also be done to an object of type B.  This is trivially true if the two
1006/// types are the same, or if B is a subclass of A.  It becomes more complex
1007/// in cases where protocols are involved.
1008///
1009/// Object types in Objective-C describe the minimum requirements for an
1010/// object, rather than providing a complete description of a type.  For
1011/// example, if A is a subclass of B, then B* may refer to an instance of A.
1012/// The principle of substitutability means that we may use an instance of A
1013/// anywhere that we may use an instance of B - it will implement all of the
1014/// ivars of B and all of the methods of B.
1015///
1016/// This substitutability is important when type checking methods, because
1017/// the implementation may have stricter type definitions than the interface.
1018/// The interface specifies minimum requirements, but the implementation may
1019/// have more accurate ones.  For example, a method may privately accept
1020/// instances of B, but only publish that it accepts instances of A.  Any
1021/// object passed to it will be type checked against B, and so will implicitly
1022/// by a valid A*.  Similarly, a method may return a subclass of the class that
1023/// it is declared as returning.
1024///
1025/// This is most important when considering subclassing.  A method in a
1026/// subclass must accept any object as an argument that its superclass's
1027/// implementation accepts.  It may, however, accept a more general type
1028/// without breaking substitutability (i.e. you can still use the subclass
1029/// anywhere that you can use the superclass, but not vice versa).  The
1030/// converse requirement applies to return types: the return type for a
1031/// subclass method must be a valid object of the kind that the superclass
1032/// advertises, but it may be specified more accurately.  This avoids the need
1033/// for explicit down-casting by callers.
1034///
1035/// Note: This is a stricter requirement than for assignment.
1036static bool isObjCTypeSubstitutable(ASTContext &Context,
1037                                    const ObjCObjectPointerType *A,
1038                                    const ObjCObjectPointerType *B,
1039                                    bool rejectId) {
1040  // Reject a protocol-unqualified id.
1041  if (rejectId && B->isObjCIdType()) return false;
1042
1043  // If B is a qualified id, then A must also be a qualified id and it must
1044  // implement all of the protocols in B.  It may not be a qualified class.
1045  // For example, MyClass<A> can be assigned to id<A>, but MyClass<A> is a
1046  // stricter definition so it is not substitutable for id<A>.
1047  if (B->isObjCQualifiedIdType()) {
1048    return A->isObjCQualifiedIdType() &&
1049           Context.ObjCQualifiedIdTypesAreCompatible(QualType(A, 0),
1050                                                     QualType(B,0),
1051                                                     false);
1052  }
1053
1054  /*
1055  // id is a special type that bypasses type checking completely.  We want a
1056  // warning when it is used in one place but not another.
1057  if (C.isObjCIdType(A) || C.isObjCIdType(B)) return false;
1058
1059
1060  // If B is a qualified id, then A must also be a qualified id (which it isn't
1061  // if we've got this far)
1062  if (B->isObjCQualifiedIdType()) return false;
1063  */
1064
1065  // Now we know that A and B are (potentially-qualified) class types.  The
1066  // normal rules for assignment apply.
1067  return Context.canAssignObjCInterfaces(A, B);
1068}
1069
1070static SourceRange getTypeRange(TypeSourceInfo *TSI) {
1071  return (TSI ? TSI->getTypeLoc().getSourceRange() : SourceRange());
1072}
1073
1074static bool CheckMethodOverrideReturn(Sema &S,
1075                                      ObjCMethodDecl *MethodImpl,
1076                                      ObjCMethodDecl *MethodDecl,
1077                                      bool IsProtocolMethodDecl,
1078                                      bool IsDeclaration,
1079                                      bool Warn) {
1080  if (IsProtocolMethodDecl &&
1081      (MethodDecl->getObjCDeclQualifier() !=
1082       MethodImpl->getObjCDeclQualifier())) {
1083    if (Warn) {
1084      S.Diag(MethodImpl->getLocation(),
1085             diag::warn_conflicting_ret_type_modifiers)
1086          << MethodImpl->getDeclName() << IsDeclaration
1087          << getTypeRange(MethodImpl->getResultTypeSourceInfo());
1088        S.Diag(MethodDecl->getLocation(), diag::note_previous_declaration)
1089          << getTypeRange(MethodDecl->getResultTypeSourceInfo());
1090    }
1091    else
1092      return false;
1093  }
1094
1095  if (S.Context.hasSameUnqualifiedType(MethodImpl->getResultType(),
1096                                       MethodDecl->getResultType()))
1097    return true;
1098  if (!Warn)
1099    return false;
1100
1101  unsigned DiagID = diag::warn_conflicting_ret_types;
1102
1103  // Mismatches between ObjC pointers go into a different warning
1104  // category, and sometimes they're even completely whitelisted.
1105  if (const ObjCObjectPointerType *ImplPtrTy =
1106        MethodImpl->getResultType()->getAs<ObjCObjectPointerType>()) {
1107    if (const ObjCObjectPointerType *IfacePtrTy =
1108          MethodDecl->getResultType()->getAs<ObjCObjectPointerType>()) {
1109      // Allow non-matching return types as long as they don't violate
1110      // the principle of substitutability.  Specifically, we permit
1111      // return types that are subclasses of the declared return type,
1112      // or that are more-qualified versions of the declared type.
1113      if (isObjCTypeSubstitutable(S.Context, IfacePtrTy, ImplPtrTy, false))
1114        return false;
1115
1116      DiagID = diag::warn_non_covariant_ret_types;
1117    }
1118  }
1119
1120  S.Diag(MethodImpl->getLocation(), DiagID)
1121    << MethodImpl->getDeclName()
1122    << MethodDecl->getResultType()
1123    << MethodImpl->getResultType()
1124    << IsDeclaration
1125    << getTypeRange(MethodImpl->getResultTypeSourceInfo());
1126  S.Diag(MethodDecl->getLocation(), diag::note_previous_definition)
1127    << getTypeRange(MethodDecl->getResultTypeSourceInfo());
1128  return false;
1129}
1130
1131static bool CheckMethodOverrideParam(Sema &S,
1132                                     ObjCMethodDecl *MethodImpl,
1133                                     ObjCMethodDecl *MethodDecl,
1134                                     ParmVarDecl *ImplVar,
1135                                     ParmVarDecl *IfaceVar,
1136                                     bool IsProtocolMethodDecl,
1137                                     bool IsDeclaration,
1138                                     bool Warn) {
1139  if (IsProtocolMethodDecl &&
1140      (ImplVar->getObjCDeclQualifier() !=
1141       IfaceVar->getObjCDeclQualifier())) {
1142    if (Warn) {
1143      S.Diag(ImplVar->getLocation(),
1144             diag::warn_conflicting_param_modifiers)
1145          << getTypeRange(ImplVar->getTypeSourceInfo())
1146          << MethodImpl->getDeclName() << IsDeclaration;
1147      S.Diag(IfaceVar->getLocation(), diag::note_previous_declaration)
1148          << getTypeRange(IfaceVar->getTypeSourceInfo());
1149    }
1150    else
1151      return false;
1152  }
1153
1154  QualType ImplTy = ImplVar->getType();
1155  QualType IfaceTy = IfaceVar->getType();
1156
1157  if (S.Context.hasSameUnqualifiedType(ImplTy, IfaceTy))
1158    return true;
1159
1160  if (!Warn)
1161    return false;
1162  unsigned DiagID = diag::warn_conflicting_param_types;
1163
1164  // Mismatches between ObjC pointers go into a different warning
1165  // category, and sometimes they're even completely whitelisted.
1166  if (const ObjCObjectPointerType *ImplPtrTy =
1167        ImplTy->getAs<ObjCObjectPointerType>()) {
1168    if (const ObjCObjectPointerType *IfacePtrTy =
1169          IfaceTy->getAs<ObjCObjectPointerType>()) {
1170      // Allow non-matching argument types as long as they don't
1171      // violate the principle of substitutability.  Specifically, the
1172      // implementation must accept any objects that the superclass
1173      // accepts, however it may also accept others.
1174      if (isObjCTypeSubstitutable(S.Context, ImplPtrTy, IfacePtrTy, true))
1175        return false;
1176
1177      DiagID = diag::warn_non_contravariant_param_types;
1178    }
1179  }
1180
1181  S.Diag(ImplVar->getLocation(), DiagID)
1182    << getTypeRange(ImplVar->getTypeSourceInfo())
1183    << MethodImpl->getDeclName() << IfaceTy << ImplTy
1184    << IsDeclaration;
1185  S.Diag(IfaceVar->getLocation(), diag::note_previous_definition)
1186    << getTypeRange(IfaceVar->getTypeSourceInfo());
1187  return false;
1188}
1189
1190/// In ARC, check whether the conventional meanings of the two methods
1191/// match.  If they don't, it's a hard error.
1192static bool checkMethodFamilyMismatch(Sema &S, ObjCMethodDecl *impl,
1193                                      ObjCMethodDecl *decl) {
1194  ObjCMethodFamily implFamily = impl->getMethodFamily();
1195  ObjCMethodFamily declFamily = decl->getMethodFamily();
1196  if (implFamily == declFamily) return false;
1197
1198  // Since conventions are sorted by selector, the only possibility is
1199  // that the types differ enough to cause one selector or the other
1200  // to fall out of the family.
1201  assert(implFamily == OMF_None || declFamily == OMF_None);
1202
1203  // No further diagnostics required on invalid declarations.
1204  if (impl->isInvalidDecl() || decl->isInvalidDecl()) return true;
1205
1206  const ObjCMethodDecl *unmatched = impl;
1207  ObjCMethodFamily family = declFamily;
1208  unsigned errorID = diag::err_arc_lost_method_convention;
1209  unsigned noteID = diag::note_arc_lost_method_convention;
1210  if (declFamily == OMF_None) {
1211    unmatched = decl;
1212    family = implFamily;
1213    errorID = diag::err_arc_gained_method_convention;
1214    noteID = diag::note_arc_gained_method_convention;
1215  }
1216
1217  // Indexes into a %select clause in the diagnostic.
1218  enum FamilySelector {
1219    F_alloc, F_copy, F_mutableCopy = F_copy, F_init, F_new
1220  };
1221  FamilySelector familySelector = FamilySelector();
1222
1223  switch (family) {
1224  case OMF_None: llvm_unreachable("logic error, no method convention");
1225  case OMF_retain:
1226  case OMF_release:
1227  case OMF_autorelease:
1228  case OMF_dealloc:
1229  case OMF_retainCount:
1230  case OMF_self:
1231  case OMF_performSelector:
1232    // Mismatches for these methods don't change ownership
1233    // conventions, so we don't care.
1234    return false;
1235
1236  case OMF_init: familySelector = F_init; break;
1237  case OMF_alloc: familySelector = F_alloc; break;
1238  case OMF_copy: familySelector = F_copy; break;
1239  case OMF_mutableCopy: familySelector = F_mutableCopy; break;
1240  case OMF_new: familySelector = F_new; break;
1241  }
1242
1243  enum ReasonSelector { R_NonObjectReturn, R_UnrelatedReturn };
1244  ReasonSelector reasonSelector;
1245
1246  // The only reason these methods don't fall within their families is
1247  // due to unusual result types.
1248  if (unmatched->getResultType()->isObjCObjectPointerType()) {
1249    reasonSelector = R_UnrelatedReturn;
1250  } else {
1251    reasonSelector = R_NonObjectReturn;
1252  }
1253
1254  S.Diag(impl->getLocation(), errorID) << familySelector << reasonSelector;
1255  S.Diag(decl->getLocation(), noteID) << familySelector << reasonSelector;
1256
1257  return true;
1258}
1259
1260void Sema::WarnConflictingTypedMethods(ObjCMethodDecl *ImpMethodDecl,
1261                                       ObjCMethodDecl *MethodDecl,
1262                                       bool IsProtocolMethodDecl,
1263                                       bool IsDeclaration) {
1264  if (getLangOptions().ObjCAutoRefCount &&
1265      checkMethodFamilyMismatch(*this, ImpMethodDecl, MethodDecl))
1266    return;
1267
1268  CheckMethodOverrideReturn(*this, ImpMethodDecl, MethodDecl,
1269                            IsProtocolMethodDecl, IsDeclaration, true);
1270
1271  for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(),
1272       IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end();
1273       IM != EM; ++IM, ++IF)
1274    CheckMethodOverrideParam(*this, ImpMethodDecl, MethodDecl, *IM, *IF,
1275                             IsProtocolMethodDecl, IsDeclaration, true);
1276
1277  if (ImpMethodDecl->isVariadic() != MethodDecl->isVariadic()) {
1278    Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_variadic)
1279      << IsDeclaration;
1280    Diag(MethodDecl->getLocation(), diag::note_previous_declaration);
1281  }
1282}
1283
1284/// WarnOnMismatchedProtocolMethods - Issues warning on type mismatched
1285/// protocols methods and then returns true(matched), or false(mismatched).
1286bool Sema::WarnOnMismatchedProtocolMethods(ObjCMethodDecl *ImpMethodDecl,
1287                                           ObjCMethodDecl *MethodDecl) {
1288
1289  bool match = CheckMethodOverrideReturn(*this, ImpMethodDecl, MethodDecl,
1290                                         true,
1291                                         true, true);
1292  if (!match)
1293    return false;
1294
1295  for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(),
1296       IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end();
1297       IM != EM; ++IM, ++IF) {
1298    match = CheckMethodOverrideParam(*this, ImpMethodDecl, MethodDecl, *IM, *IF,
1299                                     true, true, true);
1300    if (!match)
1301      return false;
1302  }
1303
1304  if (ImpMethodDecl->isVariadic() != MethodDecl->isVariadic()) {
1305    Diag(ImpMethodDecl->getLocation(), diag::warn_conflicting_variadic)
1306    << true;
1307    Diag(MethodDecl->getLocation(), diag::note_previous_declaration);
1308    return false;
1309  }
1310  return true;
1311}
1312
1313/// WarnExactTypedMethods - This routine issues a warning if method
1314/// implementation declaration matches exactly that of its declaration.
1315void Sema::WarnExactTypedMethods(ObjCMethodDecl *ImpMethodDecl,
1316                                 ObjCMethodDecl *MethodDecl,
1317                                 bool IsProtocolMethodDecl) {
1318  // don't issue warning when protocol method is optional because primary
1319  // class is not required to implement it and it is safe for protocol
1320  // to implement it.
1321  if (MethodDecl->getImplementationControl() == ObjCMethodDecl::Optional)
1322    return;
1323  // don't issue warning when primary class's method is
1324  // depecated/unavailable.
1325  if (MethodDecl->hasAttr<UnavailableAttr>() ||
1326      MethodDecl->hasAttr<DeprecatedAttr>())
1327    return;
1328
1329  bool match = CheckMethodOverrideReturn(*this, ImpMethodDecl, MethodDecl,
1330                                      IsProtocolMethodDecl, false, false);
1331  if (match)
1332    for (ObjCMethodDecl::param_iterator IM = ImpMethodDecl->param_begin(),
1333         IF = MethodDecl->param_begin(), EM = ImpMethodDecl->param_end();
1334         IM != EM; ++IM, ++IF) {
1335      match = CheckMethodOverrideParam(*this, ImpMethodDecl, MethodDecl,
1336                                       *IM, *IF,
1337                                       IsProtocolMethodDecl, false, false);
1338      if (!match)
1339        break;
1340    }
1341  if (match)
1342    match = (ImpMethodDecl->isVariadic() == MethodDecl->isVariadic());
1343  if (match)
1344    match = !(MethodDecl->isClassMethod() &&
1345              MethodDecl->getSelector() == GetNullarySelector("load", Context));
1346
1347  if (match) {
1348    Diag(ImpMethodDecl->getLocation(),
1349         diag::warn_category_method_impl_match);
1350    Diag(MethodDecl->getLocation(), diag::note_method_declared_at);
1351  }
1352}
1353
1354/// FIXME: Type hierarchies in Objective-C can be deep. We could most likely
1355/// improve the efficiency of selector lookups and type checking by associating
1356/// with each protocol / interface / category the flattened instance tables. If
1357/// we used an immutable set to keep the table then it wouldn't add significant
1358/// memory cost and it would be handy for lookups.
1359
1360/// CheckProtocolMethodDefs - This routine checks unimplemented methods
1361/// Declared in protocol, and those referenced by it.
1362void Sema::CheckProtocolMethodDefs(SourceLocation ImpLoc,
1363                                   ObjCProtocolDecl *PDecl,
1364                                   bool& IncompleteImpl,
1365                                   const llvm::DenseSet<Selector> &InsMap,
1366                                   const llvm::DenseSet<Selector> &ClsMap,
1367                                   ObjCContainerDecl *CDecl) {
1368  ObjCInterfaceDecl *IDecl;
1369  if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl))
1370    IDecl = C->getClassInterface();
1371  else
1372    IDecl = dyn_cast<ObjCInterfaceDecl>(CDecl);
1373  assert (IDecl && "CheckProtocolMethodDefs - IDecl is null");
1374
1375  ObjCInterfaceDecl *Super = IDecl->getSuperClass();
1376  ObjCInterfaceDecl *NSIDecl = 0;
1377  if (getLangOptions().NeXTRuntime) {
1378    // check to see if class implements forwardInvocation method and objects
1379    // of this class are derived from 'NSProxy' so that to forward requests
1380    // from one object to another.
1381    // Under such conditions, which means that every method possible is
1382    // implemented in the class, we should not issue "Method definition not
1383    // found" warnings.
1384    // FIXME: Use a general GetUnarySelector method for this.
1385    IdentifierInfo* II = &Context.Idents.get("forwardInvocation");
1386    Selector fISelector = Context.Selectors.getSelector(1, &II);
1387    if (InsMap.count(fISelector))
1388      // Is IDecl derived from 'NSProxy'? If so, no instance methods
1389      // need be implemented in the implementation.
1390      NSIDecl = IDecl->lookupInheritedClass(&Context.Idents.get("NSProxy"));
1391  }
1392
1393  // If a method lookup fails locally we still need to look and see if
1394  // the method was implemented by a base class or an inherited
1395  // protocol. This lookup is slow, but occurs rarely in correct code
1396  // and otherwise would terminate in a warning.
1397
1398  // check unimplemented instance methods.
1399  if (!NSIDecl)
1400    for (ObjCProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(),
1401         E = PDecl->instmeth_end(); I != E; ++I) {
1402      ObjCMethodDecl *method = *I;
1403      if (method->getImplementationControl() != ObjCMethodDecl::Optional &&
1404          !method->isSynthesized() && !InsMap.count(method->getSelector()) &&
1405          (!Super ||
1406           !Super->lookupInstanceMethod(method->getSelector()))) {
1407            // Ugly, but necessary. Method declared in protcol might have
1408            // have been synthesized due to a property declared in the class which
1409            // uses the protocol.
1410            ObjCMethodDecl *MethodInClass =
1411            IDecl->lookupInstanceMethod(method->getSelector());
1412            if (!MethodInClass || !MethodInClass->isSynthesized()) {
1413              unsigned DIAG = diag::warn_unimplemented_protocol_method;
1414              if (Diags.getDiagnosticLevel(DIAG, ImpLoc)
1415                      != Diagnostic::Ignored) {
1416                WarnUndefinedMethod(ImpLoc, method, IncompleteImpl, DIAG);
1417                Diag(method->getLocation(), diag::note_method_declared_at);
1418                Diag(CDecl->getLocation(), diag::note_required_for_protocol_at)
1419                  << PDecl->getDeclName();
1420              }
1421            }
1422          }
1423    }
1424  // check unimplemented class methods
1425  for (ObjCProtocolDecl::classmeth_iterator
1426         I = PDecl->classmeth_begin(), E = PDecl->classmeth_end();
1427       I != E; ++I) {
1428    ObjCMethodDecl *method = *I;
1429    if (method->getImplementationControl() != ObjCMethodDecl::Optional &&
1430        !ClsMap.count(method->getSelector()) &&
1431        (!Super || !Super->lookupClassMethod(method->getSelector()))) {
1432      unsigned DIAG = diag::warn_unimplemented_protocol_method;
1433      if (Diags.getDiagnosticLevel(DIAG, ImpLoc) != Diagnostic::Ignored) {
1434        WarnUndefinedMethod(ImpLoc, method, IncompleteImpl, DIAG);
1435        Diag(method->getLocation(), diag::note_method_declared_at);
1436        Diag(IDecl->getLocation(), diag::note_required_for_protocol_at) <<
1437          PDecl->getDeclName();
1438      }
1439    }
1440  }
1441  // Check on this protocols's referenced protocols, recursively.
1442  for (ObjCProtocolDecl::protocol_iterator PI = PDecl->protocol_begin(),
1443       E = PDecl->protocol_end(); PI != E; ++PI)
1444    CheckProtocolMethodDefs(ImpLoc, *PI, IncompleteImpl, InsMap, ClsMap, IDecl);
1445}
1446
1447/// MatchAllMethodDeclarations - Check methods declared in interface
1448/// or protocol against those declared in their implementations.
1449///
1450void Sema::MatchAllMethodDeclarations(const llvm::DenseSet<Selector> &InsMap,
1451                                      const llvm::DenseSet<Selector> &ClsMap,
1452                                      llvm::DenseSet<Selector> &InsMapSeen,
1453                                      llvm::DenseSet<Selector> &ClsMapSeen,
1454                                      ObjCImplDecl* IMPDecl,
1455                                      ObjCContainerDecl* CDecl,
1456                                      bool &IncompleteImpl,
1457                                      bool ImmediateClass,
1458                                      bool WarnExactMatch) {
1459  // Check and see if instance methods in class interface have been
1460  // implemented in the implementation class. If so, their types match.
1461  for (ObjCInterfaceDecl::instmeth_iterator I = CDecl->instmeth_begin(),
1462       E = CDecl->instmeth_end(); I != E; ++I) {
1463    if (InsMapSeen.count((*I)->getSelector()))
1464        continue;
1465    InsMapSeen.insert((*I)->getSelector());
1466    if (!(*I)->isSynthesized() &&
1467        !InsMap.count((*I)->getSelector())) {
1468      if (ImmediateClass)
1469        WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl,
1470                            diag::note_undef_method_impl);
1471      continue;
1472    } else {
1473      ObjCMethodDecl *ImpMethodDecl =
1474      IMPDecl->getInstanceMethod((*I)->getSelector());
1475      ObjCMethodDecl *MethodDecl =
1476      CDecl->getInstanceMethod((*I)->getSelector());
1477      assert(MethodDecl &&
1478             "MethodDecl is null in ImplMethodsVsClassMethods");
1479      // ImpMethodDecl may be null as in a @dynamic property.
1480      if (ImpMethodDecl) {
1481        if (!WarnExactMatch)
1482          WarnConflictingTypedMethods(ImpMethodDecl, MethodDecl,
1483                                      isa<ObjCProtocolDecl>(CDecl));
1484        else
1485          WarnExactTypedMethods(ImpMethodDecl, MethodDecl,
1486                               isa<ObjCProtocolDecl>(CDecl));
1487      }
1488    }
1489  }
1490
1491  // Check and see if class methods in class interface have been
1492  // implemented in the implementation class. If so, their types match.
1493   for (ObjCInterfaceDecl::classmeth_iterator
1494       I = CDecl->classmeth_begin(), E = CDecl->classmeth_end(); I != E; ++I) {
1495     if (ClsMapSeen.count((*I)->getSelector()))
1496       continue;
1497     ClsMapSeen.insert((*I)->getSelector());
1498    if (!ClsMap.count((*I)->getSelector())) {
1499      if (ImmediateClass)
1500        WarnUndefinedMethod(IMPDecl->getLocation(), *I, IncompleteImpl,
1501                            diag::note_undef_method_impl);
1502    } else {
1503      ObjCMethodDecl *ImpMethodDecl =
1504        IMPDecl->getClassMethod((*I)->getSelector());
1505      ObjCMethodDecl *MethodDecl =
1506        CDecl->getClassMethod((*I)->getSelector());
1507      if (!WarnExactMatch)
1508        WarnConflictingTypedMethods(ImpMethodDecl, MethodDecl,
1509                                    isa<ObjCProtocolDecl>(CDecl));
1510      else
1511        WarnExactTypedMethods(ImpMethodDecl, MethodDecl,
1512                             isa<ObjCProtocolDecl>(CDecl));
1513    }
1514  }
1515
1516  if (ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl> (CDecl)) {
1517    // Also methods in class extensions need be looked at next.
1518    for (const ObjCCategoryDecl *ClsExtDecl = I->getFirstClassExtension();
1519         ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension())
1520      MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
1521                                 IMPDecl,
1522                                 const_cast<ObjCCategoryDecl *>(ClsExtDecl),
1523                                 IncompleteImpl, false, WarnExactMatch);
1524
1525    // Check for any implementation of a methods declared in protocol.
1526    for (ObjCInterfaceDecl::all_protocol_iterator
1527          PI = I->all_referenced_protocol_begin(),
1528          E = I->all_referenced_protocol_end(); PI != E; ++PI)
1529      MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
1530                                 IMPDecl,
1531                                 (*PI), IncompleteImpl, false, WarnExactMatch);
1532
1533    // FIXME. For now, we are not checking for extact match of methods
1534    // in category implementation and its primary class's super class.
1535    if (!WarnExactMatch && I->getSuperClass())
1536      MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
1537                                 IMPDecl,
1538                                 I->getSuperClass(), IncompleteImpl, false);
1539  }
1540}
1541
1542/// MatchMethodsInClassAndProtocols - This routine goes thru list of methods
1543/// declared in the class, and its class extensions. For each method which is
1544/// also declared in one of its qualifying protocols, they must type match or
1545/// it issues a warning.
1546static void MatchMethodsInClassAndProtocols(Sema &S,
1547                                              const ObjCContainerDecl *IDecl,
1548                              Sema::ProtocolsMethodsMap &InstMethodsInProtocols,
1549                              Sema::ProtocolsMethodsMap &ClsMethodsInProtocols) {
1550  for (ObjCInterfaceDecl::instmeth_iterator IM = IDecl->instmeth_begin(),
1551       E = IDecl->instmeth_end(); IM != E; ++IM) {
1552    Selector Sel = (*IM)->getSelector();
1553    if (ObjCMethodDecl *ProtoMethodDecl = InstMethodsInProtocols[Sel]) {
1554      ObjCMethodDecl *ClsMethodDecl = (*IM);
1555      S.WarnConflictingTypedMethods(ClsMethodDecl,
1556                                    ProtoMethodDecl, true, true);
1557    }
1558  }
1559  for (ObjCInterfaceDecl::classmeth_iterator IM = IDecl->classmeth_begin(),
1560       E = IDecl->classmeth_end(); IM != E; ++IM) {
1561    Selector Sel = (*IM)->getSelector();
1562    if (ObjCMethodDecl *ProtoMethodDecl = ClsMethodsInProtocols[Sel]) {
1563      ObjCMethodDecl *ClsMethodDecl = (*IM);
1564      S.WarnConflictingTypedMethods(ClsMethodDecl,
1565                                    ProtoMethodDecl, true, true);
1566    }
1567  }
1568
1569  if (const ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl>(IDecl)) {
1570    for (const ObjCCategoryDecl *ClsExtDecl = I->getFirstClassExtension();
1571         ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension())
1572      MatchMethodsInClassAndProtocols(S, ClsExtDecl, InstMethodsInProtocols,
1573                                        ClsMethodsInProtocols);
1574  }
1575}
1576
1577/// CollectMethodsInOneProtocol - This routine collects all methods declared
1578/// in a given protocol.
1579static void CollectMethodsInOneProtocol(const ObjCProtocolDecl *PDecl,
1580                              Sema::ProtocolsMethodsMap &InstMethodsInProtocols,
1581                              Sema::ProtocolsMethodsMap &ClsMethodsInProtocols) {
1582  for (ObjCProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(),
1583       E = PDecl->instmeth_end(); I != E; ++I) {
1584    ObjCMethodDecl *method = *I;
1585    ObjCMethodDecl *&ProtocolEntry =
1586    InstMethodsInProtocols[method->getSelector()];
1587    if (!ProtocolEntry)
1588      ProtocolEntry = method;
1589  }
1590  for (ObjCProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(),
1591       E = PDecl->classmeth_end(); I != E; ++I) {
1592    ObjCMethodDecl *method = *I;
1593    ObjCMethodDecl *&ProtocolEntry =
1594    ClsMethodsInProtocols[method->getSelector()];
1595    if (!ProtocolEntry)
1596      ProtocolEntry = method;
1597  }
1598}
1599
1600/// CollectAllMethodsInProtocols - Helper routine to collect all methods
1601/// declared in given class's immediate and nested protocols.
1602static void CollectAllMethodsInProtocols(const ObjCContainerDecl *ContDecl,
1603                              Sema::MethodsInProtocols &InstMethodsInProtocols,
1604                              Sema::MethodsInProtocols & ClsMethodsInProtocols) {
1605  if (const ObjCInterfaceDecl *CDecl = dyn_cast<ObjCInterfaceDecl>(ContDecl)) {
1606    for (ObjCInterfaceDecl::all_protocol_iterator
1607         PI = CDecl->all_referenced_protocol_begin(),
1608         E = CDecl->all_referenced_protocol_end(); PI != E; ++PI)
1609      CollectAllMethodsInProtocols(*PI, InstMethodsInProtocols,
1610                                   ClsMethodsInProtocols);
1611  }
1612
1613  if (const ObjCProtocolDecl *PDecl = dyn_cast<ObjCProtocolDecl>(ContDecl)) {
1614    for (ObjCProtocolDecl::instmeth_iterator I = PDecl->instmeth_begin(),
1615         E = PDecl->instmeth_end(); I != E; ++I) {
1616      ObjCMethodDecl *method = *I;
1617      InstMethodsInProtocols.push_back(Sema::PROTOCOL_METHODS(method->getSelector(),
1618                                                        method));
1619    }
1620    for (ObjCProtocolDecl::classmeth_iterator I = PDecl->classmeth_begin(),
1621         E = PDecl->classmeth_end(); I != E; ++I) {
1622      ObjCMethodDecl *method = *I;
1623      ClsMethodsInProtocols.push_back(Sema::PROTOCOL_METHODS(method->getSelector(),
1624                                                       method));
1625    }
1626
1627    for (ObjCProtocolDecl::protocol_iterator
1628         PI = PDecl->protocol_begin(),
1629         E = PDecl->protocol_end(); PI != E; ++PI)
1630      CollectAllMethodsInProtocols(*PI, InstMethodsInProtocols,
1631                                   ClsMethodsInProtocols);
1632  }
1633}
1634
1635/// CollectMethodsInProtocols - This routine collects all methods declared
1636/// in class's list and nested qualified protocols. Instance methods and
1637/// class methods have separate containers as they have identical selectors.
1638static void CollectMethodsInProtocols(const ObjCContainerDecl *ContDecl,
1639                              Sema::ProtocolsMethodsMap &InstMethodsInProtocols,
1640                              Sema::ProtocolsMethodsMap &ClsMethodsInProtocols) {
1641  if (const ObjCInterfaceDecl *CDecl = dyn_cast<ObjCInterfaceDecl>(ContDecl)) {
1642    for (ObjCInterfaceDecl::all_protocol_iterator
1643         PI = CDecl->all_referenced_protocol_begin(),
1644         E = CDecl->all_referenced_protocol_end(); PI != E; ++PI) {
1645      ObjCProtocolDecl *PDecl = (*PI);
1646      CollectMethodsInOneProtocol(PDecl, InstMethodsInProtocols,
1647                                  ClsMethodsInProtocols);
1648
1649      for (ObjCProtocolDecl::protocol_iterator P = PDecl->protocol_begin(),
1650           PE = PDecl->protocol_end(); P != PE; ++P)
1651        CollectMethodsInProtocols((*P), InstMethodsInProtocols,
1652                                  ClsMethodsInProtocols);
1653    }
1654    if (CDecl->getSuperClass())
1655      CollectMethodsInProtocols(CDecl->getSuperClass(), InstMethodsInProtocols,
1656                                ClsMethodsInProtocols);
1657  }
1658
1659  if (const ObjCProtocolDecl *PDecl = dyn_cast<ObjCProtocolDecl>(ContDecl))
1660    CollectMethodsInOneProtocol(PDecl, InstMethodsInProtocols,
1661                                ClsMethodsInProtocols);
1662
1663}
1664
1665/// MatchMethodsInClassAndItsProtocol - Check that any redeclaration of
1666/// method in protocol in its qualified class match in their type and
1667/// issue warnings otherwise.
1668void Sema::MatchMethodsInClassAndItsProtocol(const ObjCInterfaceDecl *CDecl) {
1669  ProtocolsMethodsMap InstMethodsInProtocols, ClsMethodsInProtocols;
1670  CollectMethodsInProtocols(CDecl, InstMethodsInProtocols,
1671                            ClsMethodsInProtocols);
1672
1673  if (InstMethodsInProtocols.empty() && ClsMethodsInProtocols.empty())
1674    return;
1675  MatchMethodsInClassAndProtocols(*this, CDecl, InstMethodsInProtocols,
1676                                    ClsMethodsInProtocols);
1677}
1678
1679/// MatchMethodsWithIdenticalSelectors - Helper routine to go through list
1680/// of identical selector lists and issue warning for any type mismatche
1681/// of these methods.
1682static bool MatchMethodsWithIdenticalSelectors(Sema &S,
1683                                               const Sema::MethodsInProtocols Methods) {
1684  bool res = true;
1685  int size = Methods.size();
1686  int i = 0;
1687  while (i < size) {
1688    int upper = i;
1689    while (upper < size &&
1690           (Methods[i].Sel == Methods[upper].Sel))
1691      upper++;
1692    if (upper > i) {
1693      int lo = i;
1694      int hi = upper - 1;
1695
1696      if (lo < hi) {
1697        Sema::IdenticalSelectorMethods SelectedMethods;
1698        for (int l = lo; l <= hi; l++) {
1699          ObjCMethodDecl *method = Methods[l].Method;
1700          Sema::IDENTICAL_SELECTOR_METHODS
1701            SelectedMethod(method->getLocation(), method);
1702          SelectedMethods.push_back(SelectedMethod);
1703        }
1704        llvm::array_pod_sort(SelectedMethods.begin(), SelectedMethods.end());
1705        lo = 0; hi = SelectedMethods.size()-1;
1706        while (lo < hi) {
1707          ObjCMethodDecl *targetMethod = SelectedMethods[lo].Method;
1708          for (int j = lo+1; j <= hi; j++) {
1709            // match two methods;
1710            ObjCMethodDecl *otherMethod = SelectedMethods[j].Method;
1711            if (!S.WarnOnMismatchedProtocolMethods(targetMethod, otherMethod))
1712              res = false;
1713          }
1714          ++lo;
1715        }
1716      }
1717    }
1718    i += upper;
1719  }
1720  return res;
1721}
1722
1723/// MatchIdenticalSelectorsInProtocols - Main routine to go through list of
1724/// class's protocols (and their protocols) and make sure that methods
1725/// type match across all protocols and issue warnings if they don't.
1726/// FIXME. This may move to static analyzer if performance is proven
1727/// prohibitive.
1728void Sema::MatchIdenticalSelectorsInProtocols(const ObjCInterfaceDecl *CDecl) {
1729  Sema::MethodsInProtocols InsMethods;
1730  Sema::MethodsInProtocols ClsMethods;
1731  CollectAllMethodsInProtocols(CDecl, InsMethods, ClsMethods);
1732
1733  bool match = true;
1734  if (!InsMethods.empty()) {
1735    llvm::array_pod_sort(InsMethods.begin(), InsMethods.end());
1736    if (!MatchMethodsWithIdenticalSelectors(*this, InsMethods))
1737      match = false;
1738  }
1739
1740  if (!ClsMethods.empty()) {
1741    llvm::array_pod_sort(ClsMethods.begin(), ClsMethods.end());
1742    if (!MatchMethodsWithIdenticalSelectors(*this, ClsMethods))
1743      match = false;
1744  }
1745  if (!match)
1746    Diag(CDecl->getLocation() ,diag::note_class_declared);
1747}
1748
1749
1750/// CheckCategoryVsClassMethodMatches - Checks that methods implemented in
1751/// category matches with those implemented in its primary class and
1752/// warns each time an exact match is found.
1753void Sema::CheckCategoryVsClassMethodMatches(
1754                                  ObjCCategoryImplDecl *CatIMPDecl) {
1755  llvm::DenseSet<Selector> InsMap, ClsMap;
1756
1757  for (ObjCImplementationDecl::instmeth_iterator
1758       I = CatIMPDecl->instmeth_begin(),
1759       E = CatIMPDecl->instmeth_end(); I!=E; ++I)
1760    InsMap.insert((*I)->getSelector());
1761
1762  for (ObjCImplementationDecl::classmeth_iterator
1763       I = CatIMPDecl->classmeth_begin(),
1764       E = CatIMPDecl->classmeth_end(); I != E; ++I)
1765    ClsMap.insert((*I)->getSelector());
1766  if (InsMap.empty() && ClsMap.empty())
1767    return;
1768
1769  // Get category's primary class.
1770  ObjCCategoryDecl *CatDecl = CatIMPDecl->getCategoryDecl();
1771  if (!CatDecl)
1772    return;
1773  ObjCInterfaceDecl *IDecl = CatDecl->getClassInterface();
1774  if (!IDecl)
1775    return;
1776  llvm::DenseSet<Selector> InsMapSeen, ClsMapSeen;
1777  bool IncompleteImpl = false;
1778  MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
1779                             CatIMPDecl, IDecl,
1780                             IncompleteImpl, false, true /*WarnExactMatch*/);
1781}
1782
1783void Sema::ImplMethodsVsClassMethods(Scope *S, ObjCImplDecl* IMPDecl,
1784                                     ObjCContainerDecl* CDecl,
1785                                     bool IncompleteImpl) {
1786  llvm::DenseSet<Selector> InsMap;
1787  // Check and see if instance methods in class interface have been
1788  // implemented in the implementation class.
1789  for (ObjCImplementationDecl::instmeth_iterator
1790         I = IMPDecl->instmeth_begin(), E = IMPDecl->instmeth_end(); I!=E; ++I)
1791    InsMap.insert((*I)->getSelector());
1792
1793  // Check and see if properties declared in the interface have either 1)
1794  // an implementation or 2) there is a @synthesize/@dynamic implementation
1795  // of the property in the @implementation.
1796  if (isa<ObjCInterfaceDecl>(CDecl) &&
1797        !(LangOpts.ObjCDefaultSynthProperties && LangOpts.ObjCNonFragileABI2))
1798    DiagnoseUnimplementedProperties(S, IMPDecl, CDecl, InsMap);
1799
1800  llvm::DenseSet<Selector> ClsMap;
1801  for (ObjCImplementationDecl::classmeth_iterator
1802       I = IMPDecl->classmeth_begin(),
1803       E = IMPDecl->classmeth_end(); I != E; ++I)
1804    ClsMap.insert((*I)->getSelector());
1805
1806  // Check for type conflict of methods declared in a class/protocol and
1807  // its implementation; if any.
1808  llvm::DenseSet<Selector> InsMapSeen, ClsMapSeen;
1809  MatchAllMethodDeclarations(InsMap, ClsMap, InsMapSeen, ClsMapSeen,
1810                             IMPDecl, CDecl,
1811                             IncompleteImpl, true);
1812  // Check for any type mismtch of methods declared in class
1813  // and methods declared in protocol. Do this only when the class
1814  // is being implementaed.
1815  if (isa<ObjCImplementationDecl>(IMPDecl))
1816    if (const ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl>(CDecl)) {
1817      MatchIdenticalSelectorsInProtocols(I);
1818      MatchMethodsInClassAndItsProtocol(I);
1819    }
1820
1821  // check all methods implemented in category against those declared
1822  // in its primary class.
1823  if (ObjCCategoryImplDecl *CatDecl =
1824        dyn_cast<ObjCCategoryImplDecl>(IMPDecl))
1825    CheckCategoryVsClassMethodMatches(CatDecl);
1826
1827  // Check the protocol list for unimplemented methods in the @implementation
1828  // class.
1829  // Check and see if class methods in class interface have been
1830  // implemented in the implementation class.
1831
1832  if (ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl> (CDecl)) {
1833    for (ObjCInterfaceDecl::all_protocol_iterator
1834          PI = I->all_referenced_protocol_begin(),
1835          E = I->all_referenced_protocol_end(); PI != E; ++PI)
1836      CheckProtocolMethodDefs(IMPDecl->getLocation(), *PI, IncompleteImpl,
1837                              InsMap, ClsMap, I);
1838    // Check class extensions (unnamed categories)
1839    for (const ObjCCategoryDecl *Categories = I->getFirstClassExtension();
1840         Categories; Categories = Categories->getNextClassExtension())
1841      ImplMethodsVsClassMethods(S, IMPDecl,
1842                                const_cast<ObjCCategoryDecl*>(Categories),
1843                                IncompleteImpl);
1844  } else if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(CDecl)) {
1845    // For extended class, unimplemented methods in its protocols will
1846    // be reported in the primary class.
1847    if (!C->IsClassExtension()) {
1848      for (ObjCCategoryDecl::protocol_iterator PI = C->protocol_begin(),
1849           E = C->protocol_end(); PI != E; ++PI)
1850        CheckProtocolMethodDefs(IMPDecl->getLocation(), *PI, IncompleteImpl,
1851                                InsMap, ClsMap, CDecl);
1852      // Report unimplemented properties in the category as well.
1853      // When reporting on missing setter/getters, do not report when
1854      // setter/getter is implemented in category's primary class
1855      // implementation.
1856      if (ObjCInterfaceDecl *ID = C->getClassInterface())
1857        if (ObjCImplDecl *IMP = ID->getImplementation()) {
1858          for (ObjCImplementationDecl::instmeth_iterator
1859               I = IMP->instmeth_begin(), E = IMP->instmeth_end(); I!=E; ++I)
1860            InsMap.insert((*I)->getSelector());
1861        }
1862      DiagnoseUnimplementedProperties(S, IMPDecl, CDecl, InsMap);
1863    }
1864  } else
1865    assert(false && "invalid ObjCContainerDecl type.");
1866}
1867
1868/// ActOnForwardClassDeclaration -
1869Decl *
1870Sema::ActOnForwardClassDeclaration(SourceLocation AtClassLoc,
1871                                   IdentifierInfo **IdentList,
1872                                   SourceLocation *IdentLocs,
1873                                   unsigned NumElts) {
1874  SmallVector<ObjCInterfaceDecl*, 32> Interfaces;
1875
1876  for (unsigned i = 0; i != NumElts; ++i) {
1877    // Check for another declaration kind with the same name.
1878    NamedDecl *PrevDecl
1879      = LookupSingleName(TUScope, IdentList[i], IdentLocs[i],
1880                         LookupOrdinaryName, ForRedeclaration);
1881    if (PrevDecl && PrevDecl->isTemplateParameter()) {
1882      // Maybe we will complain about the shadowed template parameter.
1883      DiagnoseTemplateParameterShadow(AtClassLoc, PrevDecl);
1884      // Just pretend that we didn't see the previous declaration.
1885      PrevDecl = 0;
1886    }
1887
1888    if (PrevDecl && !isa<ObjCInterfaceDecl>(PrevDecl)) {
1889      // GCC apparently allows the following idiom:
1890      //
1891      // typedef NSObject < XCElementTogglerP > XCElementToggler;
1892      // @class XCElementToggler;
1893      //
1894      // FIXME: Make an extension?
1895      TypedefNameDecl *TDD = dyn_cast<TypedefNameDecl>(PrevDecl);
1896      if (!TDD || !TDD->getUnderlyingType()->isObjCObjectType()) {
1897        Diag(AtClassLoc, diag::err_redefinition_different_kind) << IdentList[i];
1898        Diag(PrevDecl->getLocation(), diag::note_previous_definition);
1899      } else {
1900        // a forward class declaration matching a typedef name of a class refers
1901        // to the underlying class.
1902        if (const ObjCObjectType *OI =
1903              TDD->getUnderlyingType()->getAs<ObjCObjectType>())
1904          PrevDecl = OI->getInterface();
1905      }
1906    }
1907    ObjCInterfaceDecl *IDecl = dyn_cast_or_null<ObjCInterfaceDecl>(PrevDecl);
1908    if (!IDecl) {  // Not already seen?  Make a forward decl.
1909      IDecl = ObjCInterfaceDecl::Create(Context, CurContext, AtClassLoc,
1910                                        IdentList[i], IdentLocs[i], true);
1911
1912      // Push the ObjCInterfaceDecl on the scope chain but do *not* add it to
1913      // the current DeclContext.  This prevents clients that walk DeclContext
1914      // from seeing the imaginary ObjCInterfaceDecl until it is actually
1915      // declared later (if at all).  We also take care to explicitly make
1916      // sure this declaration is visible for name lookup.
1917      PushOnScopeChains(IDecl, TUScope, false);
1918      CurContext->makeDeclVisibleInContext(IDecl, true);
1919    }
1920
1921    Interfaces.push_back(IDecl);
1922  }
1923
1924  assert(Interfaces.size() == NumElts);
1925  ObjCClassDecl *CDecl = ObjCClassDecl::Create(Context, CurContext, AtClassLoc,
1926                                               Interfaces.data(), IdentLocs,
1927                                               Interfaces.size());
1928  CurContext->addDecl(CDecl);
1929  CheckObjCDeclScope(CDecl);
1930  return CDecl;
1931}
1932
1933static bool tryMatchRecordTypes(ASTContext &Context,
1934                                Sema::MethodMatchStrategy strategy,
1935                                const Type *left, const Type *right);
1936
1937static bool matchTypes(ASTContext &Context, Sema::MethodMatchStrategy strategy,
1938                       QualType leftQT, QualType rightQT) {
1939  const Type *left =
1940    Context.getCanonicalType(leftQT).getUnqualifiedType().getTypePtr();
1941  const Type *right =
1942    Context.getCanonicalType(rightQT).getUnqualifiedType().getTypePtr();
1943
1944  if (left == right) return true;
1945
1946  // If we're doing a strict match, the types have to match exactly.
1947  if (strategy == Sema::MMS_strict) return false;
1948
1949  if (left->isIncompleteType() || right->isIncompleteType()) return false;
1950
1951  // Otherwise, use this absurdly complicated algorithm to try to
1952  // validate the basic, low-level compatibility of the two types.
1953
1954  // As a minimum, require the sizes and alignments to match.
1955  if (Context.getTypeInfo(left) != Context.getTypeInfo(right))
1956    return false;
1957
1958  // Consider all the kinds of non-dependent canonical types:
1959  // - functions and arrays aren't possible as return and parameter types
1960
1961  // - vector types of equal size can be arbitrarily mixed
1962  if (isa<VectorType>(left)) return isa<VectorType>(right);
1963  if (isa<VectorType>(right)) return false;
1964
1965  // - references should only match references of identical type
1966  // - structs, unions, and Objective-C objects must match more-or-less
1967  //   exactly
1968  // - everything else should be a scalar
1969  if (!left->isScalarType() || !right->isScalarType())
1970    return tryMatchRecordTypes(Context, strategy, left, right);
1971
1972  // Make scalars agree in kind, except count bools as chars.
1973  Type::ScalarTypeKind leftSK = left->getScalarTypeKind();
1974  Type::ScalarTypeKind rightSK = right->getScalarTypeKind();
1975  if (leftSK == Type::STK_Bool) leftSK = Type::STK_Integral;
1976  if (rightSK == Type::STK_Bool) rightSK = Type::STK_Integral;
1977
1978  // Note that data member pointers and function member pointers don't
1979  // intermix because of the size differences.
1980
1981  return (leftSK == rightSK);
1982}
1983
1984static bool tryMatchRecordTypes(ASTContext &Context,
1985                                Sema::MethodMatchStrategy strategy,
1986                                const Type *lt, const Type *rt) {
1987  assert(lt && rt && lt != rt);
1988
1989  if (!isa<RecordType>(lt) || !isa<RecordType>(rt)) return false;
1990  RecordDecl *left = cast<RecordType>(lt)->getDecl();
1991  RecordDecl *right = cast<RecordType>(rt)->getDecl();
1992
1993  // Require union-hood to match.
1994  if (left->isUnion() != right->isUnion()) return false;
1995
1996  // Require an exact match if either is non-POD.
1997  if ((isa<CXXRecordDecl>(left) && !cast<CXXRecordDecl>(left)->isPOD()) ||
1998      (isa<CXXRecordDecl>(right) && !cast<CXXRecordDecl>(right)->isPOD()))
1999    return false;
2000
2001  // Require size and alignment to match.
2002  if (Context.getTypeInfo(lt) != Context.getTypeInfo(rt)) return false;
2003
2004  // Require fields to match.
2005  RecordDecl::field_iterator li = left->field_begin(), le = left->field_end();
2006  RecordDecl::field_iterator ri = right->field_begin(), re = right->field_end();
2007  for (; li != le && ri != re; ++li, ++ri) {
2008    if (!matchTypes(Context, strategy, li->getType(), ri->getType()))
2009      return false;
2010  }
2011  return (li == le && ri == re);
2012}
2013
2014/// MatchTwoMethodDeclarations - Checks that two methods have matching type and
2015/// returns true, or false, accordingly.
2016/// TODO: Handle protocol list; such as id<p1,p2> in type comparisons
2017bool Sema::MatchTwoMethodDeclarations(const ObjCMethodDecl *left,
2018                                      const ObjCMethodDecl *right,
2019                                      MethodMatchStrategy strategy) {
2020  if (!matchTypes(Context, strategy,
2021                  left->getResultType(), right->getResultType()))
2022    return false;
2023
2024  if (getLangOptions().ObjCAutoRefCount &&
2025      (left->hasAttr<NSReturnsRetainedAttr>()
2026         != right->hasAttr<NSReturnsRetainedAttr>() ||
2027       left->hasAttr<NSConsumesSelfAttr>()
2028         != right->hasAttr<NSConsumesSelfAttr>()))
2029    return false;
2030
2031  ObjCMethodDecl::param_iterator
2032    li = left->param_begin(), le = left->param_end(), ri = right->param_begin();
2033
2034  for (; li != le; ++li, ++ri) {
2035    assert(ri != right->param_end() && "Param mismatch");
2036    ParmVarDecl *lparm = *li, *rparm = *ri;
2037
2038    if (!matchTypes(Context, strategy, lparm->getType(), rparm->getType()))
2039      return false;
2040
2041    if (getLangOptions().ObjCAutoRefCount &&
2042        lparm->hasAttr<NSConsumedAttr>() != rparm->hasAttr<NSConsumedAttr>())
2043      return false;
2044  }
2045  return true;
2046}
2047
2048/// \brief Read the contents of the method pool for a given selector from
2049/// external storage.
2050///
2051/// This routine should only be called once, when the method pool has no entry
2052/// for this selector.
2053Sema::GlobalMethodPool::iterator Sema::ReadMethodPool(Selector Sel) {
2054  assert(ExternalSource && "We need an external AST source");
2055  assert(MethodPool.find(Sel) == MethodPool.end() &&
2056         "Selector data already loaded into the method pool");
2057
2058  // Read the method list from the external source.
2059  GlobalMethods Methods = ExternalSource->ReadMethodPool(Sel);
2060
2061  return MethodPool.insert(std::make_pair(Sel, Methods)).first;
2062}
2063
2064void Sema::AddMethodToGlobalPool(ObjCMethodDecl *Method, bool impl,
2065                                 bool instance) {
2066  GlobalMethodPool::iterator Pos = MethodPool.find(Method->getSelector());
2067  if (Pos == MethodPool.end()) {
2068    if (ExternalSource)
2069      Pos = ReadMethodPool(Method->getSelector());
2070    else
2071      Pos = MethodPool.insert(std::make_pair(Method->getSelector(),
2072                                             GlobalMethods())).first;
2073  }
2074  Method->setDefined(impl);
2075  ObjCMethodList &Entry = instance ? Pos->second.first : Pos->second.second;
2076  if (Entry.Method == 0) {
2077    // Haven't seen a method with this selector name yet - add it.
2078    Entry.Method = Method;
2079    Entry.Next = 0;
2080    return;
2081  }
2082
2083  // We've seen a method with this name, see if we have already seen this type
2084  // signature.
2085  for (ObjCMethodList *List = &Entry; List; List = List->Next) {
2086    bool match = MatchTwoMethodDeclarations(Method, List->Method);
2087
2088    if (match) {
2089      ObjCMethodDecl *PrevObjCMethod = List->Method;
2090      PrevObjCMethod->setDefined(impl);
2091      // If a method is deprecated, push it in the global pool.
2092      // This is used for better diagnostics.
2093      if (Method->isDeprecated()) {
2094        if (!PrevObjCMethod->isDeprecated())
2095          List->Method = Method;
2096      }
2097      // If new method is unavailable, push it into global pool
2098      // unless previous one is deprecated.
2099      if (Method->isUnavailable()) {
2100        if (PrevObjCMethod->getAvailability() < AR_Deprecated)
2101          List->Method = Method;
2102      }
2103      return;
2104    }
2105  }
2106
2107  // We have a new signature for an existing method - add it.
2108  // This is extremely rare. Only 1% of Cocoa selectors are "overloaded".
2109  ObjCMethodList *Mem = BumpAlloc.Allocate<ObjCMethodList>();
2110  Entry.Next = new (Mem) ObjCMethodList(Method, Entry.Next);
2111}
2112
2113/// Determines if this is an "acceptable" loose mismatch in the global
2114/// method pool.  This exists mostly as a hack to get around certain
2115/// global mismatches which we can't afford to make warnings / errors.
2116/// Really, what we want is a way to take a method out of the global
2117/// method pool.
2118static bool isAcceptableMethodMismatch(ObjCMethodDecl *chosen,
2119                                       ObjCMethodDecl *other) {
2120  if (!chosen->isInstanceMethod())
2121    return false;
2122
2123  Selector sel = chosen->getSelector();
2124  if (!sel.isUnarySelector() || sel.getNameForSlot(0) != "length")
2125    return false;
2126
2127  // Don't complain about mismatches for -length if the method we
2128  // chose has an integral result type.
2129  return (chosen->getResultType()->isIntegerType());
2130}
2131
2132ObjCMethodDecl *Sema::LookupMethodInGlobalPool(Selector Sel, SourceRange R,
2133                                               bool receiverIdOrClass,
2134                                               bool warn, bool instance) {
2135  GlobalMethodPool::iterator Pos = MethodPool.find(Sel);
2136  if (Pos == MethodPool.end()) {
2137    if (ExternalSource)
2138      Pos = ReadMethodPool(Sel);
2139    else
2140      return 0;
2141  }
2142
2143  ObjCMethodList &MethList = instance ? Pos->second.first : Pos->second.second;
2144
2145  if (warn && MethList.Method && MethList.Next) {
2146    bool issueDiagnostic = false, issueError = false;
2147
2148    // We support a warning which complains about *any* difference in
2149    // method signature.
2150    bool strictSelectorMatch =
2151      (receiverIdOrClass && warn &&
2152       (Diags.getDiagnosticLevel(diag::warn_strict_multiple_method_decl,
2153                                 R.getBegin()) !=
2154      Diagnostic::Ignored));
2155    if (strictSelectorMatch)
2156      for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next) {
2157        if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method,
2158                                        MMS_strict)) {
2159          issueDiagnostic = true;
2160          break;
2161        }
2162      }
2163
2164    // If we didn't see any strict differences, we won't see any loose
2165    // differences.  In ARC, however, we also need to check for loose
2166    // mismatches, because most of them are errors.
2167    if (!strictSelectorMatch ||
2168        (issueDiagnostic && getLangOptions().ObjCAutoRefCount))
2169      for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next) {
2170        // This checks if the methods differ in type mismatch.
2171        if (!MatchTwoMethodDeclarations(MethList.Method, Next->Method,
2172                                        MMS_loose) &&
2173            !isAcceptableMethodMismatch(MethList.Method, Next->Method)) {
2174          issueDiagnostic = true;
2175          if (getLangOptions().ObjCAutoRefCount)
2176            issueError = true;
2177          break;
2178        }
2179      }
2180
2181    if (issueDiagnostic) {
2182      if (issueError)
2183        Diag(R.getBegin(), diag::err_arc_multiple_method_decl) << Sel << R;
2184      else if (strictSelectorMatch)
2185        Diag(R.getBegin(), diag::warn_strict_multiple_method_decl) << Sel << R;
2186      else
2187        Diag(R.getBegin(), diag::warn_multiple_method_decl) << Sel << R;
2188
2189      Diag(MethList.Method->getLocStart(),
2190           issueError ? diag::note_possibility : diag::note_using)
2191        << MethList.Method->getSourceRange();
2192      for (ObjCMethodList *Next = MethList.Next; Next; Next = Next->Next)
2193        Diag(Next->Method->getLocStart(), diag::note_also_found)
2194          << Next->Method->getSourceRange();
2195    }
2196  }
2197  return MethList.Method;
2198}
2199
2200ObjCMethodDecl *Sema::LookupImplementedMethodInGlobalPool(Selector Sel) {
2201  GlobalMethodPool::iterator Pos = MethodPool.find(Sel);
2202  if (Pos == MethodPool.end())
2203    return 0;
2204
2205  GlobalMethods &Methods = Pos->second;
2206
2207  if (Methods.first.Method && Methods.first.Method->isDefined())
2208    return Methods.first.Method;
2209  if (Methods.second.Method && Methods.second.Method->isDefined())
2210    return Methods.second.Method;
2211  return 0;
2212}
2213
2214/// CompareMethodParamsInBaseAndSuper - This routine compares methods with
2215/// identical selector names in current and its super classes and issues
2216/// a warning if any of their argument types are incompatible.
2217void Sema::CompareMethodParamsInBaseAndSuper(Decl *ClassDecl,
2218                                             ObjCMethodDecl *Method,
2219                                             bool IsInstance)  {
2220  ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(ClassDecl);
2221  if (ID == 0) return;
2222
2223  while (ObjCInterfaceDecl *SD = ID->getSuperClass()) {
2224    ObjCMethodDecl *SuperMethodDecl =
2225        SD->lookupMethod(Method->getSelector(), IsInstance);
2226    if (SuperMethodDecl == 0) {
2227      ID = SD;
2228      continue;
2229    }
2230    ObjCMethodDecl::param_iterator ParamI = Method->param_begin(),
2231      E = Method->param_end();
2232    ObjCMethodDecl::param_iterator PrevI = SuperMethodDecl->param_begin();
2233    for (; ParamI != E; ++ParamI, ++PrevI) {
2234      // Number of parameters are the same and is guaranteed by selector match.
2235      assert(PrevI != SuperMethodDecl->param_end() && "Param mismatch");
2236      QualType T1 = Context.getCanonicalType((*ParamI)->getType());
2237      QualType T2 = Context.getCanonicalType((*PrevI)->getType());
2238      // If type of argument of method in this class does not match its
2239      // respective argument type in the super class method, issue warning;
2240      if (!Context.typesAreCompatible(T1, T2)) {
2241        Diag((*ParamI)->getLocation(), diag::ext_typecheck_base_super)
2242          << T1 << T2;
2243        Diag(SuperMethodDecl->getLocation(), diag::note_previous_declaration);
2244        return;
2245      }
2246    }
2247    ID = SD;
2248  }
2249}
2250
2251/// DiagnoseDuplicateIvars -
2252/// Check for duplicate ivars in the entire class at the start of
2253/// @implementation. This becomes necesssary because class extension can
2254/// add ivars to a class in random order which will not be known until
2255/// class's @implementation is seen.
2256void Sema::DiagnoseDuplicateIvars(ObjCInterfaceDecl *ID,
2257                                  ObjCInterfaceDecl *SID) {
2258  for (ObjCInterfaceDecl::ivar_iterator IVI = ID->ivar_begin(),
2259       IVE = ID->ivar_end(); IVI != IVE; ++IVI) {
2260    ObjCIvarDecl* Ivar = (*IVI);
2261    if (Ivar->isInvalidDecl())
2262      continue;
2263    if (IdentifierInfo *II = Ivar->getIdentifier()) {
2264      ObjCIvarDecl* prevIvar = SID->lookupInstanceVariable(II);
2265      if (prevIvar) {
2266        Diag(Ivar->getLocation(), diag::err_duplicate_member) << II;
2267        Diag(prevIvar->getLocation(), diag::note_previous_declaration);
2268        Ivar->setInvalidDecl();
2269      }
2270    }
2271  }
2272}
2273
2274// Note: For class/category implemenations, allMethods/allProperties is
2275// always null.
2276void Sema::ActOnAtEnd(Scope *S, SourceRange AtEnd,
2277                      Decl *ClassDecl,
2278                      Decl **allMethods, unsigned allNum,
2279                      Decl **allProperties, unsigned pNum,
2280                      DeclGroupPtrTy *allTUVars, unsigned tuvNum) {
2281  // FIXME: If we don't have a ClassDecl, we have an error. We should consider
2282  // always passing in a decl. If the decl has an error, isInvalidDecl()
2283  // should be true.
2284  if (!ClassDecl)
2285    return;
2286
2287  bool isInterfaceDeclKind =
2288        isa<ObjCInterfaceDecl>(ClassDecl) || isa<ObjCCategoryDecl>(ClassDecl)
2289         || isa<ObjCProtocolDecl>(ClassDecl);
2290  bool checkIdenticalMethods = isa<ObjCImplementationDecl>(ClassDecl);
2291
2292  if (!isInterfaceDeclKind && AtEnd.isInvalid()) {
2293    // FIXME: This is wrong.  We shouldn't be pretending that there is
2294    //  an '@end' in the declaration.
2295    SourceLocation L = ClassDecl->getLocation();
2296    AtEnd.setBegin(L);
2297    AtEnd.setEnd(L);
2298    Diag(L, diag::err_missing_atend);
2299  }
2300
2301  // FIXME: Remove these and use the ObjCContainerDecl/DeclContext.
2302  llvm::DenseMap<Selector, const ObjCMethodDecl*> InsMap;
2303  llvm::DenseMap<Selector, const ObjCMethodDecl*> ClsMap;
2304
2305  for (unsigned i = 0; i < allNum; i++ ) {
2306    ObjCMethodDecl *Method =
2307      cast_or_null<ObjCMethodDecl>(allMethods[i]);
2308
2309    if (!Method) continue;  // Already issued a diagnostic.
2310    if (Method->isInstanceMethod()) {
2311      /// Check for instance method of the same name with incompatible types
2312      const ObjCMethodDecl *&PrevMethod = InsMap[Method->getSelector()];
2313      bool match = PrevMethod ? MatchTwoMethodDeclarations(Method, PrevMethod)
2314                              : false;
2315      if ((isInterfaceDeclKind && PrevMethod && !match)
2316          || (checkIdenticalMethods && match)) {
2317          Diag(Method->getLocation(), diag::err_duplicate_method_decl)
2318            << Method->getDeclName();
2319          Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
2320        Method->setInvalidDecl();
2321      } else {
2322        InsMap[Method->getSelector()] = Method;
2323        /// The following allows us to typecheck messages to "id".
2324        AddInstanceMethodToGlobalPool(Method);
2325        // verify that the instance method conforms to the same definition of
2326        // parent methods if it shadows one.
2327        CompareMethodParamsInBaseAndSuper(ClassDecl, Method, true);
2328      }
2329    } else {
2330      /// Check for class method of the same name with incompatible types
2331      const ObjCMethodDecl *&PrevMethod = ClsMap[Method->getSelector()];
2332      bool match = PrevMethod ? MatchTwoMethodDeclarations(Method, PrevMethod)
2333                              : false;
2334      if ((isInterfaceDeclKind && PrevMethod && !match)
2335          || (checkIdenticalMethods && match)) {
2336        Diag(Method->getLocation(), diag::err_duplicate_method_decl)
2337          << Method->getDeclName();
2338        Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
2339        Method->setInvalidDecl();
2340      } else {
2341        ClsMap[Method->getSelector()] = Method;
2342        /// The following allows us to typecheck messages to "Class".
2343        AddFactoryMethodToGlobalPool(Method);
2344        // verify that the class method conforms to the same definition of
2345        // parent methods if it shadows one.
2346        CompareMethodParamsInBaseAndSuper(ClassDecl, Method, false);
2347      }
2348    }
2349  }
2350  if (ObjCInterfaceDecl *I = dyn_cast<ObjCInterfaceDecl>(ClassDecl)) {
2351    // Compares properties declared in this class to those of its
2352    // super class.
2353    ComparePropertiesInBaseAndSuper(I);
2354    CompareProperties(I, I);
2355  } else if (ObjCCategoryDecl *C = dyn_cast<ObjCCategoryDecl>(ClassDecl)) {
2356    // Categories are used to extend the class by declaring new methods.
2357    // By the same token, they are also used to add new properties. No
2358    // need to compare the added property to those in the class.
2359
2360    // Compare protocol properties with those in category
2361    CompareProperties(C, C);
2362    if (C->IsClassExtension()) {
2363      ObjCInterfaceDecl *CCPrimary = C->getClassInterface();
2364      DiagnoseClassExtensionDupMethods(C, CCPrimary);
2365    }
2366  }
2367  if (ObjCContainerDecl *CDecl = dyn_cast<ObjCContainerDecl>(ClassDecl)) {
2368    if (CDecl->getIdentifier())
2369      // ProcessPropertyDecl is responsible for diagnosing conflicts with any
2370      // user-defined setter/getter. It also synthesizes setter/getter methods
2371      // and adds them to the DeclContext and global method pools.
2372      for (ObjCContainerDecl::prop_iterator I = CDecl->prop_begin(),
2373                                            E = CDecl->prop_end();
2374           I != E; ++I)
2375        ProcessPropertyDecl(*I, CDecl);
2376    CDecl->setAtEndRange(AtEnd);
2377  }
2378  if (ObjCImplementationDecl *IC=dyn_cast<ObjCImplementationDecl>(ClassDecl)) {
2379    IC->setAtEndRange(AtEnd);
2380    if (ObjCInterfaceDecl* IDecl = IC->getClassInterface()) {
2381      // Any property declared in a class extension might have user
2382      // declared setter or getter in current class extension or one
2383      // of the other class extensions. Mark them as synthesized as
2384      // property will be synthesized when property with same name is
2385      // seen in the @implementation.
2386      for (const ObjCCategoryDecl *ClsExtDecl =
2387           IDecl->getFirstClassExtension();
2388           ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension()) {
2389        for (ObjCContainerDecl::prop_iterator I = ClsExtDecl->prop_begin(),
2390             E = ClsExtDecl->prop_end(); I != E; ++I) {
2391          ObjCPropertyDecl *Property = (*I);
2392          // Skip over properties declared @dynamic
2393          if (const ObjCPropertyImplDecl *PIDecl
2394              = IC->FindPropertyImplDecl(Property->getIdentifier()))
2395            if (PIDecl->getPropertyImplementation()
2396                  == ObjCPropertyImplDecl::Dynamic)
2397              continue;
2398
2399          for (const ObjCCategoryDecl *CExtDecl =
2400               IDecl->getFirstClassExtension();
2401               CExtDecl; CExtDecl = CExtDecl->getNextClassExtension()) {
2402            if (ObjCMethodDecl *GetterMethod =
2403                CExtDecl->getInstanceMethod(Property->getGetterName()))
2404              GetterMethod->setSynthesized(true);
2405            if (!Property->isReadOnly())
2406              if (ObjCMethodDecl *SetterMethod =
2407                  CExtDecl->getInstanceMethod(Property->getSetterName()))
2408                SetterMethod->setSynthesized(true);
2409          }
2410        }
2411      }
2412
2413      if (LangOpts.ObjCDefaultSynthProperties &&
2414          LangOpts.ObjCNonFragileABI2)
2415        DefaultSynthesizeProperties(S, IC, IDecl);
2416      ImplMethodsVsClassMethods(S, IC, IDecl);
2417      AtomicPropertySetterGetterRules(IC, IDecl);
2418      DiagnoseOwningPropertyGetterSynthesis(IC);
2419
2420      if (LangOpts.ObjCNonFragileABI2)
2421        while (IDecl->getSuperClass()) {
2422          DiagnoseDuplicateIvars(IDecl, IDecl->getSuperClass());
2423          IDecl = IDecl->getSuperClass();
2424        }
2425    }
2426    SetIvarInitializers(IC);
2427  } else if (ObjCCategoryImplDecl* CatImplClass =
2428                                   dyn_cast<ObjCCategoryImplDecl>(ClassDecl)) {
2429    CatImplClass->setAtEndRange(AtEnd);
2430
2431    // Find category interface decl and then check that all methods declared
2432    // in this interface are implemented in the category @implementation.
2433    if (ObjCInterfaceDecl* IDecl = CatImplClass->getClassInterface()) {
2434      for (ObjCCategoryDecl *Categories = IDecl->getCategoryList();
2435           Categories; Categories = Categories->getNextClassCategory()) {
2436        if (Categories->getIdentifier() == CatImplClass->getIdentifier()) {
2437          ImplMethodsVsClassMethods(S, CatImplClass, Categories);
2438          break;
2439        }
2440      }
2441    }
2442  }
2443  if (isInterfaceDeclKind) {
2444    // Reject invalid vardecls.
2445    for (unsigned i = 0; i != tuvNum; i++) {
2446      DeclGroupRef DG = allTUVars[i].getAsVal<DeclGroupRef>();
2447      for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
2448        if (VarDecl *VDecl = dyn_cast<VarDecl>(*I)) {
2449          if (!VDecl->hasExternalStorage())
2450            Diag(VDecl->getLocation(), diag::err_objc_var_decl_inclass);
2451        }
2452    }
2453  }
2454}
2455
2456
2457/// CvtQTToAstBitMask - utility routine to produce an AST bitmask for
2458/// objective-c's type qualifier from the parser version of the same info.
2459static Decl::ObjCDeclQualifier
2460CvtQTToAstBitMask(ObjCDeclSpec::ObjCDeclQualifier PQTVal) {
2461  return (Decl::ObjCDeclQualifier) (unsigned) PQTVal;
2462}
2463
2464static inline
2465bool containsInvalidMethodImplAttribute(const AttrVec &A) {
2466  // The 'ibaction' attribute is allowed on method definitions because of
2467  // how the IBAction macro is used on both method declarations and definitions.
2468  // If the method definitions contains any other attributes, return true.
2469  for (AttrVec::const_iterator i = A.begin(), e = A.end(); i != e; ++i)
2470    if ((*i)->getKind() != attr::IBAction)
2471      return true;
2472  return false;
2473}
2474
2475/// \brief Check whether the declared result type of the given Objective-C
2476/// method declaration is compatible with the method's class.
2477///
2478static bool
2479CheckRelatedResultTypeCompatibility(Sema &S, ObjCMethodDecl *Method,
2480                                    ObjCInterfaceDecl *CurrentClass) {
2481  QualType ResultType = Method->getResultType();
2482  SourceRange ResultTypeRange;
2483  if (const TypeSourceInfo *ResultTypeInfo = Method->getResultTypeSourceInfo())
2484    ResultTypeRange = ResultTypeInfo->getTypeLoc().getSourceRange();
2485
2486  // If an Objective-C method inherits its related result type, then its
2487  // declared result type must be compatible with its own class type. The
2488  // declared result type is compatible if:
2489  if (const ObjCObjectPointerType *ResultObjectType
2490                                = ResultType->getAs<ObjCObjectPointerType>()) {
2491    //   - it is id or qualified id, or
2492    if (ResultObjectType->isObjCIdType() ||
2493        ResultObjectType->isObjCQualifiedIdType())
2494      return false;
2495
2496    if (CurrentClass) {
2497      if (ObjCInterfaceDecl *ResultClass
2498                                      = ResultObjectType->getInterfaceDecl()) {
2499        //   - it is the same as the method's class type, or
2500        if (CurrentClass == ResultClass)
2501          return false;
2502
2503        //   - it is a superclass of the method's class type
2504        if (ResultClass->isSuperClassOf(CurrentClass))
2505          return false;
2506      }
2507    }
2508  }
2509
2510  return true;
2511}
2512
2513namespace {
2514/// A helper class for searching for methods which a particular method
2515/// overrides.
2516class OverrideSearch {
2517  Sema &S;
2518  ObjCMethodDecl *Method;
2519  llvm::SmallPtrSet<ObjCContainerDecl*, 8> Searched;
2520  llvm::SmallPtrSet<ObjCMethodDecl*, 8> Overridden;
2521  bool Recursive;
2522
2523public:
2524  OverrideSearch(Sema &S, ObjCMethodDecl *method) : S(S), Method(method) {
2525    Selector selector = method->getSelector();
2526
2527    // Bypass this search if we've never seen an instance/class method
2528    // with this selector before.
2529    Sema::GlobalMethodPool::iterator it = S.MethodPool.find(selector);
2530    if (it == S.MethodPool.end()) {
2531      if (!S.ExternalSource) return;
2532      it = S.ReadMethodPool(selector);
2533    }
2534    ObjCMethodList &list =
2535      method->isInstanceMethod() ? it->second.first : it->second.second;
2536    if (!list.Method) return;
2537
2538    ObjCContainerDecl *container
2539      = cast<ObjCContainerDecl>(method->getDeclContext());
2540
2541    // Prevent the search from reaching this container again.  This is
2542    // important with categories, which override methods from the
2543    // interface and each other.
2544    Searched.insert(container);
2545    searchFromContainer(container);
2546  }
2547
2548  typedef llvm::SmallPtrSet<ObjCMethodDecl*,8>::iterator iterator;
2549  iterator begin() const { return Overridden.begin(); }
2550  iterator end() const { return Overridden.end(); }
2551
2552private:
2553  void searchFromContainer(ObjCContainerDecl *container) {
2554    if (container->isInvalidDecl()) return;
2555
2556    switch (container->getDeclKind()) {
2557#define OBJCCONTAINER(type, base) \
2558    case Decl::type: \
2559      searchFrom(cast<type##Decl>(container)); \
2560      break;
2561#define ABSTRACT_DECL(expansion)
2562#define DECL(type, base) \
2563    case Decl::type:
2564#include "clang/AST/DeclNodes.inc"
2565      llvm_unreachable("not an ObjC container!");
2566    }
2567  }
2568
2569  void searchFrom(ObjCProtocolDecl *protocol) {
2570    // A method in a protocol declaration overrides declarations from
2571    // referenced ("parent") protocols.
2572    search(protocol->getReferencedProtocols());
2573  }
2574
2575  void searchFrom(ObjCCategoryDecl *category) {
2576    // A method in a category declaration overrides declarations from
2577    // the main class and from protocols the category references.
2578    search(category->getClassInterface());
2579    search(category->getReferencedProtocols());
2580  }
2581
2582  void searchFrom(ObjCCategoryImplDecl *impl) {
2583    // A method in a category definition that has a category
2584    // declaration overrides declarations from the category
2585    // declaration.
2586    if (ObjCCategoryDecl *category = impl->getCategoryDecl()) {
2587      search(category);
2588
2589    // Otherwise it overrides declarations from the class.
2590    } else {
2591      search(impl->getClassInterface());
2592    }
2593  }
2594
2595  void searchFrom(ObjCInterfaceDecl *iface) {
2596    // A method in a class declaration overrides declarations from
2597
2598    //   - categories,
2599    for (ObjCCategoryDecl *category = iface->getCategoryList();
2600           category; category = category->getNextClassCategory())
2601      search(category);
2602
2603    //   - the super class, and
2604    if (ObjCInterfaceDecl *super = iface->getSuperClass())
2605      search(super);
2606
2607    //   - any referenced protocols.
2608    search(iface->getReferencedProtocols());
2609  }
2610
2611  void searchFrom(ObjCImplementationDecl *impl) {
2612    // A method in a class implementation overrides declarations from
2613    // the class interface.
2614    search(impl->getClassInterface());
2615  }
2616
2617
2618  void search(const ObjCProtocolList &protocols) {
2619    for (ObjCProtocolList::iterator i = protocols.begin(), e = protocols.end();
2620         i != e; ++i)
2621      search(*i);
2622  }
2623
2624  void search(ObjCContainerDecl *container) {
2625    // Abort if we've already searched this container.
2626    if (!Searched.insert(container)) return;
2627
2628    // Check for a method in this container which matches this selector.
2629    ObjCMethodDecl *meth = container->getMethod(Method->getSelector(),
2630                                                Method->isInstanceMethod());
2631
2632    // If we find one, record it and bail out.
2633    if (meth) {
2634      Overridden.insert(meth);
2635      return;
2636    }
2637
2638    // Otherwise, search for methods that a hypothetical method here
2639    // would have overridden.
2640
2641    // Note that we're now in a recursive case.
2642    Recursive = true;
2643
2644    searchFromContainer(container);
2645  }
2646};
2647}
2648
2649Decl *Sema::ActOnMethodDeclaration(
2650    Scope *S,
2651    SourceLocation MethodLoc, SourceLocation EndLoc,
2652    tok::TokenKind MethodType, Decl *ClassDecl,
2653    ObjCDeclSpec &ReturnQT, ParsedType ReturnType,
2654    SourceLocation SelectorStartLoc,
2655    Selector Sel,
2656    // optional arguments. The number of types/arguments is obtained
2657    // from the Sel.getNumArgs().
2658    ObjCArgInfo *ArgInfo,
2659    DeclaratorChunk::ParamInfo *CParamInfo, unsigned CNumArgs, // c-style args
2660    AttributeList *AttrList, tok::ObjCKeywordKind MethodDeclKind,
2661    bool isVariadic, bool MethodDefinition) {
2662  // Make sure we can establish a context for the method.
2663  if (!ClassDecl) {
2664    Diag(MethodLoc, diag::error_missing_method_context);
2665    return 0;
2666  }
2667  QualType resultDeclType;
2668
2669  TypeSourceInfo *ResultTInfo = 0;
2670  if (ReturnType) {
2671    resultDeclType = GetTypeFromParser(ReturnType, &ResultTInfo);
2672
2673    // Methods cannot return interface types. All ObjC objects are
2674    // passed by reference.
2675    if (resultDeclType->isObjCObjectType()) {
2676      Diag(MethodLoc, diag::err_object_cannot_be_passed_returned_by_value)
2677        << 0 << resultDeclType;
2678      return 0;
2679    }
2680  } else { // get the type for "id".
2681    resultDeclType = Context.getObjCIdType();
2682    Diag(MethodLoc, diag::warn_missing_method_return_type)
2683      << FixItHint::CreateInsertion(SelectorStartLoc, "(id)");
2684  }
2685
2686  ObjCMethodDecl* ObjCMethod =
2687    ObjCMethodDecl::Create(Context, MethodLoc, EndLoc, Sel, resultDeclType,
2688                           ResultTInfo,
2689                           cast<DeclContext>(ClassDecl),
2690                           MethodType == tok::minus, isVariadic,
2691                           false, false,
2692                           MethodDeclKind == tok::objc_optional
2693                             ? ObjCMethodDecl::Optional
2694                             : ObjCMethodDecl::Required,
2695                           false);
2696
2697  SmallVector<ParmVarDecl*, 16> Params;
2698
2699  for (unsigned i = 0, e = Sel.getNumArgs(); i != e; ++i) {
2700    QualType ArgType;
2701    TypeSourceInfo *DI;
2702
2703    if (ArgInfo[i].Type == 0) {
2704      ArgType = Context.getObjCIdType();
2705      DI = 0;
2706    } else {
2707      ArgType = GetTypeFromParser(ArgInfo[i].Type, &DI);
2708      // Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
2709      ArgType = Context.getAdjustedParameterType(ArgType);
2710    }
2711
2712    LookupResult R(*this, ArgInfo[i].Name, ArgInfo[i].NameLoc,
2713                   LookupOrdinaryName, ForRedeclaration);
2714    LookupName(R, S);
2715    if (R.isSingleResult()) {
2716      NamedDecl *PrevDecl = R.getFoundDecl();
2717      if (S->isDeclScope(PrevDecl)) {
2718        Diag(ArgInfo[i].NameLoc,
2719             (MethodDefinition ? diag::warn_method_param_redefinition
2720                               : diag::warn_method_param_declaration))
2721          << ArgInfo[i].Name;
2722        Diag(PrevDecl->getLocation(),
2723             diag::note_previous_declaration);
2724      }
2725    }
2726
2727    SourceLocation StartLoc = DI
2728      ? DI->getTypeLoc().getBeginLoc()
2729      : ArgInfo[i].NameLoc;
2730
2731    ParmVarDecl* Param = CheckParameter(ObjCMethod, StartLoc,
2732                                        ArgInfo[i].NameLoc, ArgInfo[i].Name,
2733                                        ArgType, DI, SC_None, SC_None);
2734
2735    Param->setObjCMethodScopeInfo(i);
2736
2737    Param->setObjCDeclQualifier(
2738      CvtQTToAstBitMask(ArgInfo[i].DeclSpec.getObjCDeclQualifier()));
2739
2740    // Apply the attributes to the parameter.
2741    ProcessDeclAttributeList(TUScope, Param, ArgInfo[i].ArgAttrs);
2742
2743    S->AddDecl(Param);
2744    IdResolver.AddDecl(Param);
2745
2746    Params.push_back(Param);
2747  }
2748
2749  for (unsigned i = 0, e = CNumArgs; i != e; ++i) {
2750    ParmVarDecl *Param = cast<ParmVarDecl>(CParamInfo[i].Param);
2751    QualType ArgType = Param->getType();
2752    if (ArgType.isNull())
2753      ArgType = Context.getObjCIdType();
2754    else
2755      // Perform the default array/function conversions (C99 6.7.5.3p[7,8]).
2756      ArgType = Context.getAdjustedParameterType(ArgType);
2757    if (ArgType->isObjCObjectType()) {
2758      Diag(Param->getLocation(),
2759           diag::err_object_cannot_be_passed_returned_by_value)
2760      << 1 << ArgType;
2761      Param->setInvalidDecl();
2762    }
2763    Param->setDeclContext(ObjCMethod);
2764
2765    Params.push_back(Param);
2766  }
2767
2768  ObjCMethod->setMethodParams(Context, Params.data(), Params.size(),
2769                              Sel.getNumArgs());
2770  ObjCMethod->setObjCDeclQualifier(
2771    CvtQTToAstBitMask(ReturnQT.getObjCDeclQualifier()));
2772
2773  if (AttrList)
2774    ProcessDeclAttributeList(TUScope, ObjCMethod, AttrList);
2775
2776  // Add the method now.
2777  const ObjCMethodDecl *PrevMethod = 0;
2778  if (ObjCImplDecl *ImpDecl = dyn_cast<ObjCImplDecl>(ClassDecl)) {
2779    if (MethodType == tok::minus) {
2780      PrevMethod = ImpDecl->getInstanceMethod(Sel);
2781      ImpDecl->addInstanceMethod(ObjCMethod);
2782    } else {
2783      PrevMethod = ImpDecl->getClassMethod(Sel);
2784      ImpDecl->addClassMethod(ObjCMethod);
2785    }
2786
2787    if (ObjCMethod->hasAttrs() &&
2788        containsInvalidMethodImplAttribute(ObjCMethod->getAttrs()))
2789      Diag(EndLoc, diag::warn_attribute_method_def);
2790  } else {
2791    cast<DeclContext>(ClassDecl)->addDecl(ObjCMethod);
2792  }
2793
2794  if (PrevMethod) {
2795    // You can never have two method definitions with the same name.
2796    Diag(ObjCMethod->getLocation(), diag::err_duplicate_method_decl)
2797      << ObjCMethod->getDeclName();
2798    Diag(PrevMethod->getLocation(), diag::note_previous_declaration);
2799  }
2800
2801  // If this Objective-C method does not have a related result type, but we
2802  // are allowed to infer related result types, try to do so based on the
2803  // method family.
2804  ObjCInterfaceDecl *CurrentClass = dyn_cast<ObjCInterfaceDecl>(ClassDecl);
2805  if (!CurrentClass) {
2806    if (ObjCCategoryDecl *Cat = dyn_cast<ObjCCategoryDecl>(ClassDecl))
2807      CurrentClass = Cat->getClassInterface();
2808    else if (ObjCImplDecl *Impl = dyn_cast<ObjCImplDecl>(ClassDecl))
2809      CurrentClass = Impl->getClassInterface();
2810    else if (ObjCCategoryImplDecl *CatImpl
2811                                   = dyn_cast<ObjCCategoryImplDecl>(ClassDecl))
2812      CurrentClass = CatImpl->getClassInterface();
2813  }
2814
2815  bool isRelatedResultTypeCompatible =
2816    (getLangOptions().ObjCInferRelatedResultType &&
2817     !CheckRelatedResultTypeCompatibility(*this, ObjCMethod, CurrentClass));
2818
2819  // Search for overridden methods and merge information down from them.
2820  OverrideSearch overrides(*this, ObjCMethod);
2821  for (OverrideSearch::iterator
2822         i = overrides.begin(), e = overrides.end(); i != e; ++i) {
2823    ObjCMethodDecl *overridden = *i;
2824
2825    // Propagate down the 'related result type' bit from overridden methods.
2826    if (isRelatedResultTypeCompatible && overridden->hasRelatedResultType())
2827      ObjCMethod->SetRelatedResultType();
2828
2829    // Then merge the declarations.
2830    mergeObjCMethodDecls(ObjCMethod, overridden);
2831  }
2832
2833  bool ARCError = false;
2834  if (getLangOptions().ObjCAutoRefCount)
2835    ARCError = CheckARCMethodDecl(*this, ObjCMethod);
2836
2837  if (!ARCError && isRelatedResultTypeCompatible &&
2838      !ObjCMethod->hasRelatedResultType()) {
2839    bool InferRelatedResultType = false;
2840    switch (ObjCMethod->getMethodFamily()) {
2841    case OMF_None:
2842    case OMF_copy:
2843    case OMF_dealloc:
2844    case OMF_mutableCopy:
2845    case OMF_release:
2846    case OMF_retainCount:
2847    case OMF_performSelector:
2848      break;
2849
2850    case OMF_alloc:
2851    case OMF_new:
2852      InferRelatedResultType = ObjCMethod->isClassMethod();
2853      break;
2854
2855    case OMF_init:
2856    case OMF_autorelease:
2857    case OMF_retain:
2858    case OMF_self:
2859      InferRelatedResultType = ObjCMethod->isInstanceMethod();
2860      break;
2861    }
2862
2863    if (InferRelatedResultType)
2864      ObjCMethod->SetRelatedResultType();
2865  }
2866
2867  return ObjCMethod;
2868}
2869
2870bool Sema::CheckObjCDeclScope(Decl *D) {
2871  if (isa<TranslationUnitDecl>(CurContext->getRedeclContext()))
2872    return false;
2873
2874  Diag(D->getLocation(), diag::err_objc_decls_may_only_appear_in_global_scope);
2875  D->setInvalidDecl();
2876
2877  return true;
2878}
2879
2880/// Called whenever @defs(ClassName) is encountered in the source.  Inserts the
2881/// instance variables of ClassName into Decls.
2882void Sema::ActOnDefs(Scope *S, Decl *TagD, SourceLocation DeclStart,
2883                     IdentifierInfo *ClassName,
2884                     SmallVectorImpl<Decl*> &Decls) {
2885  // Check that ClassName is a valid class
2886  ObjCInterfaceDecl *Class = getObjCInterfaceDecl(ClassName, DeclStart);
2887  if (!Class) {
2888    Diag(DeclStart, diag::err_undef_interface) << ClassName;
2889    return;
2890  }
2891  if (LangOpts.ObjCNonFragileABI) {
2892    Diag(DeclStart, diag::err_atdef_nonfragile_interface);
2893    return;
2894  }
2895
2896  // Collect the instance variables
2897  SmallVector<const ObjCIvarDecl*, 32> Ivars;
2898  Context.DeepCollectObjCIvars(Class, true, Ivars);
2899  // For each ivar, create a fresh ObjCAtDefsFieldDecl.
2900  for (unsigned i = 0; i < Ivars.size(); i++) {
2901    const FieldDecl* ID = cast<FieldDecl>(Ivars[i]);
2902    RecordDecl *Record = dyn_cast<RecordDecl>(TagD);
2903    Decl *FD = ObjCAtDefsFieldDecl::Create(Context, Record,
2904                                           /*FIXME: StartL=*/ID->getLocation(),
2905                                           ID->getLocation(),
2906                                           ID->getIdentifier(), ID->getType(),
2907                                           ID->getBitWidth());
2908    Decls.push_back(FD);
2909  }
2910
2911  // Introduce all of these fields into the appropriate scope.
2912  for (SmallVectorImpl<Decl*>::iterator D = Decls.begin();
2913       D != Decls.end(); ++D) {
2914    FieldDecl *FD = cast<FieldDecl>(*D);
2915    if (getLangOptions().CPlusPlus)
2916      PushOnScopeChains(cast<FieldDecl>(FD), S);
2917    else if (RecordDecl *Record = dyn_cast<RecordDecl>(TagD))
2918      Record->addDecl(FD);
2919  }
2920}
2921
2922/// \brief Build a type-check a new Objective-C exception variable declaration.
2923VarDecl *Sema::BuildObjCExceptionDecl(TypeSourceInfo *TInfo, QualType T,
2924                                      SourceLocation StartLoc,
2925                                      SourceLocation IdLoc,
2926                                      IdentifierInfo *Id,
2927                                      bool Invalid) {
2928  // ISO/IEC TR 18037 S6.7.3: "The type of an object with automatic storage
2929  // duration shall not be qualified by an address-space qualifier."
2930  // Since all parameters have automatic store duration, they can not have
2931  // an address space.
2932  if (T.getAddressSpace() != 0) {
2933    Diag(IdLoc, diag::err_arg_with_address_space);
2934    Invalid = true;
2935  }
2936
2937  // An @catch parameter must be an unqualified object pointer type;
2938  // FIXME: Recover from "NSObject foo" by inserting the * in "NSObject *foo"?
2939  if (Invalid) {
2940    // Don't do any further checking.
2941  } else if (T->isDependentType()) {
2942    // Okay: we don't know what this type will instantiate to.
2943  } else if (!T->isObjCObjectPointerType()) {
2944    Invalid = true;
2945    Diag(IdLoc ,diag::err_catch_param_not_objc_type);
2946  } else if (T->isObjCQualifiedIdType()) {
2947    Invalid = true;
2948    Diag(IdLoc, diag::err_illegal_qualifiers_on_catch_parm);
2949  }
2950
2951  VarDecl *New = VarDecl::Create(Context, CurContext, StartLoc, IdLoc, Id,
2952                                 T, TInfo, SC_None, SC_None);
2953  New->setExceptionVariable(true);
2954
2955  if (Invalid)
2956    New->setInvalidDecl();
2957  return New;
2958}
2959
2960Decl *Sema::ActOnObjCExceptionDecl(Scope *S, Declarator &D) {
2961  const DeclSpec &DS = D.getDeclSpec();
2962
2963  // We allow the "register" storage class on exception variables because
2964  // GCC did, but we drop it completely. Any other storage class is an error.
2965  if (DS.getStorageClassSpec() == DeclSpec::SCS_register) {
2966    Diag(DS.getStorageClassSpecLoc(), diag::warn_register_objc_catch_parm)
2967      << FixItHint::CreateRemoval(SourceRange(DS.getStorageClassSpecLoc()));
2968  } else if (DS.getStorageClassSpec() != DeclSpec::SCS_unspecified) {
2969    Diag(DS.getStorageClassSpecLoc(), diag::err_storage_spec_on_catch_parm)
2970      << DS.getStorageClassSpec();
2971  }
2972  if (D.getDeclSpec().isThreadSpecified())
2973    Diag(D.getDeclSpec().getThreadSpecLoc(), diag::err_invalid_thread);
2974  D.getMutableDeclSpec().ClearStorageClassSpecs();
2975
2976  DiagnoseFunctionSpecifiers(D);
2977
2978  // Check that there are no default arguments inside the type of this
2979  // exception object (C++ only).
2980  if (getLangOptions().CPlusPlus)
2981    CheckExtraCXXDefaultArguments(D);
2982
2983  TypeSourceInfo *TInfo = GetTypeForDeclarator(D, S);
2984  QualType ExceptionType = TInfo->getType();
2985
2986  VarDecl *New = BuildObjCExceptionDecl(TInfo, ExceptionType,
2987                                        D.getSourceRange().getBegin(),
2988                                        D.getIdentifierLoc(),
2989                                        D.getIdentifier(),
2990                                        D.isInvalidType());
2991
2992  // Parameter declarators cannot be qualified (C++ [dcl.meaning]p1).
2993  if (D.getCXXScopeSpec().isSet()) {
2994    Diag(D.getIdentifierLoc(), diag::err_qualified_objc_catch_parm)
2995      << D.getCXXScopeSpec().getRange();
2996    New->setInvalidDecl();
2997  }
2998
2999  // Add the parameter declaration into this scope.
3000  S->AddDecl(New);
3001  if (D.getIdentifier())
3002    IdResolver.AddDecl(New);
3003
3004  ProcessDeclAttributes(S, New, D);
3005
3006  if (New->hasAttr<BlocksAttr>())
3007    Diag(New->getLocation(), diag::err_block_on_nonlocal);
3008  return New;
3009}
3010
3011/// CollectIvarsToConstructOrDestruct - Collect those ivars which require
3012/// initialization.
3013void Sema::CollectIvarsToConstructOrDestruct(ObjCInterfaceDecl *OI,
3014                                SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
3015  for (ObjCIvarDecl *Iv = OI->all_declared_ivar_begin(); Iv;
3016       Iv= Iv->getNextIvar()) {
3017    QualType QT = Context.getBaseElementType(Iv->getType());
3018    if (QT->isRecordType())
3019      Ivars.push_back(Iv);
3020  }
3021}
3022
3023void Sema::DiagnoseUseOfUnimplementedSelectors() {
3024  // Load referenced selectors from the external source.
3025  if (ExternalSource) {
3026    SmallVector<std::pair<Selector, SourceLocation>, 4> Sels;
3027    ExternalSource->ReadReferencedSelectors(Sels);
3028    for (unsigned I = 0, N = Sels.size(); I != N; ++I)
3029      ReferencedSelectors[Sels[I].first] = Sels[I].second;
3030  }
3031
3032  // Warning will be issued only when selector table is
3033  // generated (which means there is at lease one implementation
3034  // in the TU). This is to match gcc's behavior.
3035  if (ReferencedSelectors.empty() ||
3036      !Context.AnyObjCImplementation())
3037    return;
3038  for (llvm::DenseMap<Selector, SourceLocation>::iterator S =
3039        ReferencedSelectors.begin(),
3040       E = ReferencedSelectors.end(); S != E; ++S) {
3041    Selector Sel = (*S).first;
3042    if (!LookupImplementedMethodInGlobalPool(Sel))
3043      Diag((*S).second, diag::warn_unimplemented_selector) << Sel;
3044  }
3045  return;
3046}
3047