diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp | 218 | 
1 files changed, 102 insertions, 116 deletions
diff --git a/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp b/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp index fd2ce1749fe8..7a1b36b2d7ee 100644 --- a/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp +++ b/contrib/llvm/tools/clang/lib/Sema/SemaCodeComplete.cpp @@ -464,9 +464,8 @@ getRequiredQualification(ASTContext &Context,    NestedNameSpecifier *Result = 0;    while (!TargetParents.empty()) { -    const DeclContext *Parent = TargetParents.back(); -    TargetParents.pop_back(); -     +    const DeclContext *Parent = TargetParents.pop_back_val(); +      if (const NamespaceDecl *Namespace = dyn_cast<NamespaceDecl>(Parent)) {        if (!Namespace->getIdentifier())          continue; @@ -716,8 +715,8 @@ unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) {      return CCP_Unlikely;    // Context-based decisions. -  const DeclContext *DC = ND->getDeclContext()->getRedeclContext(); -  if (DC->isFunctionOrMethod() || isa<BlockDecl>(DC)) { +  const DeclContext *LexicalDC = ND->getLexicalDeclContext(); +  if (LexicalDC->isFunctionOrMethod()) {      // _cmd is relatively rare      if (const ImplicitParamDecl *ImplicitParam =          dyn_cast<ImplicitParamDecl>(ND)) @@ -727,6 +726,8 @@ unsigned ResultBuilder::getBasePriority(const NamedDecl *ND) {      return CCP_LocalDeclaration;    } + +  const DeclContext *DC = ND->getDeclContext()->getRedeclContext();    if (DC->isRecord() || isa<ObjCContainerDecl>(DC))      return CCP_MemberDeclaration; @@ -877,8 +878,8 @@ void ResultBuilder::MaybeAddResult(Result R, DeclContext *CurContext) {      for (; I != IEnd; ++I) {        // A tag declaration does not hide a non-tag declaration.        if (I->first->hasTagIdentifierNamespace() && -          (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary |  -                   Decl::IDNS_ObjCProtocol))) +          (IDNS & (Decl::IDNS_Member | Decl::IDNS_Ordinary | +                   Decl::IDNS_LocalExtern | Decl::IDNS_ObjCProtocol)))          continue;        // Protocols are in distinct namespaces from everything else. @@ -1039,7 +1040,9 @@ void ResultBuilder::ExitScope() {  bool ResultBuilder::IsOrdinaryName(const NamedDecl *ND) const {    ND = cast<NamedDecl>(ND->getUnderlyingDecl()); -  unsigned IDNS = Decl::IDNS_Ordinary; +  // If name lookup finds a local extern declaration, then we are in a +  // context where it behaves like an ordinary name. +  unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;    if (SemaRef.getLangOpts().CPlusPlus)      IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;    else if (SemaRef.getLangOpts().ObjC1) { @@ -1057,7 +1060,7 @@ bool ResultBuilder::IsOrdinaryNonTypeName(const NamedDecl *ND) const {    if (isa<TypeDecl>(ND) || isa<ObjCInterfaceDecl>(ND))      return false; -  unsigned IDNS = Decl::IDNS_Ordinary; +  unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;    if (SemaRef.getLangOpts().CPlusPlus)      IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace | Decl::IDNS_Member;    else if (SemaRef.getLangOpts().ObjC1) { @@ -1084,7 +1087,7 @@ bool ResultBuilder::IsIntegralConstantValue(const NamedDecl *ND) const {  bool ResultBuilder::IsOrdinaryNonValueName(const NamedDecl *ND) const {    ND = cast<NamedDecl>(ND->getUnderlyingDecl()); -  unsigned IDNS = Decl::IDNS_Ordinary; +  unsigned IDNS = Decl::IDNS_Ordinary | Decl::IDNS_LocalExtern;    if (SemaRef.getLangOpts().CPlusPlus)      IDNS |= Decl::IDNS_Tag | Decl::IDNS_Namespace; @@ -3183,12 +3186,12 @@ void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,          Builder.getAllocator().CopyString(Modules[I]->Name));        Results.AddResult(Result(Builder.TakeString(),                                 CCP_Declaration,  -                               CXCursor_NotImplemented, +                               CXCursor_ModuleImportDecl,                                 Modules[I]->isAvailable()                                   ? CXAvailability_Available                                    : CXAvailability_NotAvailable));      } -  } else { +  } else if (getLangOpts().Modules) {      // Load the named module.      Module *Mod = PP.getModuleLoader().loadModule(ImportLoc, Path,                                                    Module::AllVisible, @@ -3203,7 +3206,7 @@ void Sema::CodeCompleteModuleImport(SourceLocation ImportLoc,            Builder.getAllocator().CopyString((*Sub)->Name));          Results.AddResult(Result(Builder.TakeString(),                                   CCP_Declaration,  -                                 CXCursor_NotImplemented, +                                 CXCursor_ModuleImportDecl,                                   (*Sub)->isAvailable()                                     ? CXAvailability_Available                                     : CXAvailability_NotAvailable)); @@ -3303,8 +3306,7 @@ void Sema::CodeCompleteOrdinaryName(Scope *S,  static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,                                          ParsedType Receiver, -                                       IdentifierInfo **SelIdents, -                                       unsigned NumSelIdents, +                                       ArrayRef<IdentifierInfo *> SelIdents,                                         bool AtArgumentExpression,                                         bool IsSuper,                                         ResultBuilder &Results); @@ -3360,7 +3362,7 @@ void Sema::CodeCompleteDeclSpec(Scope *S, DeclSpec &DS,                          Scope::AtCatchScope)) == 0) {      ParsedType T = DS.getRepAsType();      if (!T.get().isNull() && T.get()->isObjCObjectOrInterfaceType()) -      AddClassMessageCompletions(*this, S, T, 0, 0, false, false, Results);  +      AddClassMessageCompletions(*this, S, T, None, false, false, Results);    }    // Note that we intentionally suppress macro results here, since we do not @@ -3436,7 +3438,7 @@ void Sema::CodeCompletePostfixExpression(Scope *S, ExprResult E) {    if (E.isInvalid())      CodeCompleteOrdinaryName(S, PCC_RecoveryInFunction);    else if (getLangOpts().ObjC1) -    CodeCompleteObjCInstanceMessage(S, E.take(), 0, 0, false); +    CodeCompleteObjCInstanceMessage(S, E.take(), None, false);  }  /// \brief The set of properties that have already been added, referenced by @@ -3611,7 +3613,7 @@ void Sema::CodeCompleteMemberReferenceExpr(Scope *S, Expr *Base,          bool IsDependent = BaseType->isDependentType();          if (!IsDependent) {            for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent()) -            if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) { +            if (DeclContext *Ctx = DepScope->getEntity()) {                IsDependent = Ctx->isDependentContext();                break;              } @@ -3847,7 +3849,7 @@ namespace {    };  } -static bool anyNullArguments(llvm::ArrayRef<Expr*> Args) { +static bool anyNullArguments(ArrayRef<Expr *> Args) {    if (Args.size() && !Args.data())      return true; @@ -3858,8 +3860,7 @@ static bool anyNullArguments(llvm::ArrayRef<Expr*> Args) {    return false;  } -void Sema::CodeCompleteCall(Scope *S, Expr *FnIn, -                            llvm::ArrayRef<Expr *> Args) { +void Sema::CodeCompleteCall(Scope *S, Expr *FnIn, ArrayRef<Expr *> Args) {    if (!CodeCompleter)      return; @@ -4150,7 +4151,7 @@ void Sema::CodeCompleteNamespaceDecl(Scope *S)  {    if (!CodeCompleter)      return; -  DeclContext *Ctx = (DeclContext *)S->getEntity(); +  DeclContext *Ctx = S->getEntity();    if (!S->getParent())      Ctx = Context.getTranslationUnitDecl(); @@ -4242,9 +4243,9 @@ void Sema::CodeCompleteOperatorName(Scope *S) {                              Results.data(),Results.size());  } -void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD, -                                              CXXCtorInitializer** Initializers, -                                              unsigned NumInitializers) { +void Sema::CodeCompleteConstructorInitializer( +                              Decl *ConstructorD, +                              ArrayRef <CXXCtorInitializer *> Initializers) {    PrintingPolicy Policy = getCompletionPrintingPolicy(*this);    CXXConstructorDecl *Constructor      = static_cast<CXXConstructorDecl *>(ConstructorD); @@ -4259,7 +4260,7 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,    // Fill in any already-initialized fields or base classes.    llvm::SmallPtrSet<FieldDecl *, 4> InitializedFields;    llvm::SmallPtrSet<CanQualType, 4> InitializedBases; -  for (unsigned I = 0; I != NumInitializers; ++I) { +  for (unsigned I = 0, E = Initializers.size(); I != E; ++I) {      if (Initializers[I]->isBaseInitializer())        InitializedBases.insert(          Context.getCanonicalType(QualType(Initializers[I]->getBaseClass(), 0))); @@ -4271,17 +4272,17 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,    // Add completions for base classes.    CodeCompletionBuilder Builder(Results.getAllocator(),                                  Results.getCodeCompletionTUInfo()); -  bool SawLastInitializer = (NumInitializers == 0); +  bool SawLastInitializer = Initializers.empty();    CXXRecordDecl *ClassDecl = Constructor->getParent();    for (CXXRecordDecl::base_class_iterator Base = ClassDecl->bases_begin(),                                         BaseEnd = ClassDecl->bases_end();         Base != BaseEnd; ++Base) {      if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {        SawLastInitializer -        = NumInitializers > 0 &&  -          Initializers[NumInitializers - 1]->isBaseInitializer() && +        = !Initializers.empty() &&  +          Initializers.back()->isBaseInitializer() &&            Context.hasSameUnqualifiedType(Base->getType(), -               QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); +               QualType(Initializers.back()->getBaseClass(), 0));        continue;      } @@ -4303,10 +4304,10 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,         Base != BaseEnd; ++Base) {      if (!InitializedBases.insert(Context.getCanonicalType(Base->getType()))) {        SawLastInitializer -        = NumInitializers > 0 &&  -          Initializers[NumInitializers - 1]->isBaseInitializer() && +        = !Initializers.empty() &&  +          Initializers.back()->isBaseInitializer() &&            Context.hasSameUnqualifiedType(Base->getType(), -               QualType(Initializers[NumInitializers - 1]->getBaseClass(), 0)); +               QualType(Initializers.back()->getBaseClass(), 0));        continue;      } @@ -4328,9 +4329,9 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,         Field != FieldEnd; ++Field) {      if (!InitializedFields.insert(cast<FieldDecl>(Field->getCanonicalDecl()))) {        SawLastInitializer -        = NumInitializers > 0 &&  -          Initializers[NumInitializers - 1]->isAnyMemberInitializer() && -          Initializers[NumInitializers - 1]->getAnyMember() == *Field; +        = !Initializers.empty() &&  +          Initializers.back()->isAnyMemberInitializer() && +          Initializers.back()->getAnyMember() == *Field;        continue;      } @@ -4358,7 +4359,7 @@ void Sema::CodeCompleteConstructorInitializer(Decl *ConstructorD,  /// \brief Determine whether this scope denotes a namespace.  static bool isNamespaceScope(Scope *S) { -  DeclContext *DC = static_cast<DeclContext *>(S->getEntity()); +  DeclContext *DC = S->getEntity();    if (!DC)      return false; @@ -4786,9 +4787,9 @@ enum ObjCMethodKind {  static bool isAcceptableObjCSelector(Selector Sel,                                       ObjCMethodKind WantKind, -                                     IdentifierInfo **SelIdents, -                                     unsigned NumSelIdents, +                                     ArrayRef<IdentifierInfo *> SelIdents,                                       bool AllowSameLength = true) { +  unsigned NumSelIdents = SelIdents.size();    if (NumSelIdents > Sel.getNumArgs())      return false; @@ -4810,11 +4811,10 @@ static bool isAcceptableObjCSelector(Selector Sel,  static bool isAcceptableObjCMethod(ObjCMethodDecl *Method,                                     ObjCMethodKind WantKind, -                                   IdentifierInfo **SelIdents, -                                   unsigned NumSelIdents, +                                   ArrayRef<IdentifierInfo *> SelIdents,                                     bool AllowSameLength = true) {    return isAcceptableObjCSelector(Method->getSelector(), WantKind, SelIdents, -                                  NumSelIdents, AllowSameLength); +                                  AllowSameLength);  }  namespace { @@ -4846,8 +4846,7 @@ namespace {  static void AddObjCMethods(ObjCContainerDecl *Container,                              bool WantInstanceMethods,                             ObjCMethodKind WantKind, -                           IdentifierInfo **SelIdents, -                           unsigned NumSelIdents, +                           ArrayRef<IdentifierInfo *> SelIdents,                             DeclContext *CurContext,                             VisitedSelectorSet &Selectors,                             bool AllowSameLength, @@ -4866,15 +4865,14 @@ static void AddObjCMethods(ObjCContainerDecl *Container,          (isRootClass && !WantInstanceMethods)) {        // Check whether the selector identifiers we've been given are a         // subset of the identifiers for this particular method. -      if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, NumSelIdents, -                                  AllowSameLength)) +      if (!isAcceptableObjCMethod(*M, WantKind, SelIdents, AllowSameLength))          continue;        if (!Selectors.insert(M->getSelector()))          continue;        Result R = Result(*M, Results.getBasePriority(*M), 0); -      R.StartParameter = NumSelIdents; +      R.StartParameter = SelIdents.size();        R.AllParametersAreInformative = (WantKind != MK_Any);        if (!InOriginalClass)          R.Priority += CCD_InBaseClass; @@ -4891,8 +4889,7 @@ static void AddObjCMethods(ObjCContainerDecl *Container,                                                  E = Protocols.end();              I != E; ++I)          AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,  -                       NumSelIdents, CurContext, Selectors, AllowSameLength,  -                       Results, false); +                       CurContext, Selectors, AllowSameLength, Results, false);      }    } @@ -4903,7 +4900,7 @@ static void AddObjCMethods(ObjCContainerDecl *Container,    for (ObjCInterfaceDecl::protocol_iterator I = IFace->protocol_begin(),                                              E = IFace->protocol_end();         I != E; ++I) -    AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents, NumSelIdents,  +    AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,                     CurContext, Selectors, AllowSameLength, Results, false);    // Add methods in categories. @@ -4914,7 +4911,7 @@ static void AddObjCMethods(ObjCContainerDecl *Container,      ObjCCategoryDecl *CatDecl = *Cat;      AddObjCMethods(CatDecl, WantInstanceMethods, WantKind, SelIdents, -                   NumSelIdents, CurContext, Selectors, AllowSameLength,  +                   CurContext, Selectors, AllowSameLength,                     Results, InOriginalClass);      // Add a categories protocol methods. @@ -4924,26 +4921,26 @@ static void AddObjCMethods(ObjCContainerDecl *Container,                                                E = Protocols.end();           I != E; ++I)        AddObjCMethods(*I, WantInstanceMethods, WantKind, SelIdents,  -                     NumSelIdents, CurContext, Selectors, AllowSameLength,  +                     CurContext, Selectors, AllowSameLength,                       Results, false);      // Add methods in category implementations.      if (ObjCCategoryImplDecl *Impl = CatDecl->getImplementation())        AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents,  -                     NumSelIdents, CurContext, Selectors, AllowSameLength,  +                     CurContext, Selectors, AllowSameLength,                       Results, InOriginalClass);    }    // Add methods in superclass.    if (IFace->getSuperClass())      AddObjCMethods(IFace->getSuperClass(), WantInstanceMethods, WantKind,  -                   SelIdents, NumSelIdents, CurContext, Selectors,  +                   SelIdents, CurContext, Selectors,                     AllowSameLength, Results, false);    // Add methods in our implementation, if any.    if (ObjCImplementationDecl *Impl = IFace->getImplementation())      AddObjCMethods(Impl, WantInstanceMethods, WantKind, SelIdents, -                   NumSelIdents, CurContext, Selectors, AllowSameLength,  +                   CurContext, Selectors, AllowSameLength,                     Results, InOriginalClass);  } @@ -4967,7 +4964,7 @@ void Sema::CodeCompleteObjCPropertyGetter(Scope *S) {    Results.EnterNewScope();    VisitedSelectorSet Selectors; -  AddObjCMethods(Class, true, MK_ZeroArgSelector, 0, 0, CurContext, Selectors, +  AddObjCMethods(Class, true, MK_ZeroArgSelector, None, CurContext, Selectors,                   /*AllowSameLength=*/true, Results);    Results.ExitScope();    HandleCodeCompleteResults(this, CodeCompleter, @@ -4995,7 +4992,7 @@ void Sema::CodeCompleteObjCPropertySetter(Scope *S) {    Results.EnterNewScope();    VisitedSelectorSet Selectors; -  AddObjCMethods(Class, true, MK_OneArgSelector, 0, 0, CurContext,  +  AddObjCMethods(Class, true, MK_OneArgSelector, None, CurContext,                   Selectors, /*AllowSameLength=*/true, Results);    Results.ExitScope(); @@ -5159,16 +5156,14 @@ static ObjCInterfaceDecl *GetAssumedMessageSendExprType(Expr *E) {  /// \param SelIdents The identifiers in the selector that have already been  /// provided as arguments for a send to "super".  /// -/// \param NumSelIdents The number of identifiers in \p SelIdents. -///  /// \param Results The set of results to augment.  ///  /// \returns the Objective-C method declaration that would be invoked by   /// this "super" completion. If NULL, no completion was added. -static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword, -                                              IdentifierInfo **SelIdents, -                                              unsigned NumSelIdents, -                                              ResultBuilder &Results) { +static ObjCMethodDecl *AddSuperSendCompletion( +                                          Sema &S, bool NeedSuperKeyword, +                                          ArrayRef<IdentifierInfo *> SelIdents, +                                          ResultBuilder &Results) {    ObjCMethodDecl *CurMethod = S.getCurMethodDecl();    if (!CurMethod)      return 0; @@ -5244,14 +5239,14 @@ static ObjCMethodDecl *AddSuperSendCompletion(Sema &S, bool NeedSuperKeyword,    } else {      ObjCMethodDecl::param_iterator CurP = CurMethod->param_begin();      for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I, ++CurP) { -      if (I > NumSelIdents) +      if (I > SelIdents.size())          Builder.AddChunk(CodeCompletionString::CK_HorizontalSpace); -      if (I < NumSelIdents) +      if (I < SelIdents.size())          Builder.AddInformativeChunk(                     Builder.getAllocator().CopyString(                                                   Sel.getNameForSlot(I) + ":")); -      else if (NeedSuperKeyword || I > NumSelIdents) { +      else if (NeedSuperKeyword || I > SelIdents.size()) {          Builder.AddTextChunk(                   Builder.getAllocator().CopyString(                                                    Sel.getNameForSlot(I) + ":")); @@ -5293,7 +5288,7 @@ void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {        if (Iface->getSuperClass()) {          Results.AddResult(Result("super")); -        AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, 0, 0, Results); +        AddSuperSendCompletion(*this, /*NeedSuperKeyword=*/true, None, Results);        }    if (getLangOpts().CPlusPlus11) @@ -5309,8 +5304,7 @@ void Sema::CodeCompleteObjCMessageReceiver(Scope *S) {  }  void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc, -                                        IdentifierInfo **SelIdents, -                                        unsigned NumSelIdents, +                                        ArrayRef<IdentifierInfo *> SelIdents,                                          bool AtArgumentExpression) {    ObjCInterfaceDecl *CDecl = 0;    if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) { @@ -5328,8 +5322,7 @@ void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,        // We are inside an instance method, which means that the message        // send [super ...] is actually calling an instance method on the        // current object. -      return CodeCompleteObjCInstanceMessage(S, 0, -                                             SelIdents, NumSelIdents, +      return CodeCompleteObjCInstanceMessage(S, 0, SelIdents,                                               AtArgumentExpression,                                               CDecl);      } @@ -5358,7 +5351,7 @@ void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,        ExprResult SuperExpr = ActOnIdExpression(S, SS, TemplateKWLoc, id,                                                 false, false);        return CodeCompleteObjCInstanceMessage(S, (Expr *)SuperExpr.get(), -                                             SelIdents, NumSelIdents, +                                             SelIdents,                                               AtArgumentExpression);      } @@ -5369,7 +5362,7 @@ void Sema::CodeCompleteObjCSuperMessage(Scope *S, SourceLocation SuperLoc,    if (CDecl)      Receiver = ParsedType::make(Context.getObjCInterfaceType(CDecl));    return CodeCompleteObjCClassMessage(S, Receiver, SelIdents,  -                                      NumSelIdents, AtArgumentExpression, +                                      AtArgumentExpression,                                        /*IsSuper=*/true);  } @@ -5409,8 +5402,7 @@ static QualType getPreferredArgumentTypeForMessageSend(ResultBuilder &Results,  static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,                                          ParsedType Receiver, -                                       IdentifierInfo **SelIdents, -                                       unsigned NumSelIdents, +                                       ArrayRef<IdentifierInfo *> SelIdents,                                         bool AtArgumentExpression,                                         bool IsSuper,                                         ResultBuilder &Results) { @@ -5434,8 +5426,7 @@ static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,    // completion.    if (IsSuper) {      if (ObjCMethodDecl *SuperMethod -        = AddSuperSendCompletion(SemaRef, false, SelIdents, NumSelIdents,  -                                 Results)) +        = AddSuperSendCompletion(SemaRef, false, SelIdents, Results))        Results.Ignore(SuperMethod);    } @@ -5446,7 +5437,7 @@ static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,    VisitedSelectorSet Selectors;    if (CDecl)  -    AddObjCMethods(CDecl, false, MK_Any, SelIdents, NumSelIdents,  +    AddObjCMethods(CDecl, false, MK_Any, SelIdents,                     SemaRef.CurContext, Selectors, AtArgumentExpression,                     Results);      else { @@ -5472,12 +5463,11 @@ static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,        for (ObjCMethodList *MethList = &M->second.second;             MethList && MethList->Method;              MethList = MethList->getNext()) { -        if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,  -                                    NumSelIdents)) +        if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))            continue;          Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); -        R.StartParameter = NumSelIdents; +        R.StartParameter = SelIdents.size();          R.AllParametersAreInformative = false;          Results.MaybeAddResult(R, SemaRef.CurContext);        } @@ -5488,8 +5478,7 @@ static void AddClassMessageCompletions(Sema &SemaRef, Scope *S,  }  void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver, -                                        IdentifierInfo **SelIdents, -                                        unsigned NumSelIdents, +                                        ArrayRef<IdentifierInfo *> SelIdents,                                          bool AtArgumentExpression,                                          bool IsSuper) { @@ -5498,9 +5487,9 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,    ResultBuilder Results(*this, CodeCompleter->getAllocator(),                          CodeCompleter->getCodeCompletionTUInfo(),                CodeCompletionContext(CodeCompletionContext::CCC_ObjCClassMessage, -                                    T, SelIdents, NumSelIdents)); +                                    T, SelIdents)); -  AddClassMessageCompletions(*this, S, Receiver, SelIdents, NumSelIdents,  +  AddClassMessageCompletions(*this, S, Receiver, SelIdents,                               AtArgumentExpression, IsSuper, Results);    // If we're actually at the argument expression (rather than prior to the  @@ -5510,7 +5499,7 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,    // our preferred type, improving completion results.    if (AtArgumentExpression) {      QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,  -                                                                  NumSelIdents); +                                                              SelIdents.size());      if (PreferredType.isNull())        CodeCompleteOrdinaryName(S, PCC_Expression);      else @@ -5524,8 +5513,7 @@ void Sema::CodeCompleteObjCClassMessage(Scope *S, ParsedType Receiver,  }  void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver, -                                           IdentifierInfo **SelIdents, -                                           unsigned NumSelIdents, +                                           ArrayRef<IdentifierInfo *> SelIdents,                                             bool AtArgumentExpression,                                             ObjCInterfaceDecl *Super) {    typedef CodeCompletionResult Result; @@ -5553,7 +5541,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,        if (ReceiverType->isObjCClassType())          return CodeCompleteObjCClassMessage(S,                          ParsedType::make(Context.getObjCInterfaceType(IFace)), -                                            SelIdents, NumSelIdents, +                                            SelIdents,                                              AtArgumentExpression, Super);        ReceiverType = Context.getObjCObjectPointerType( @@ -5564,7 +5552,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,    ResultBuilder Results(*this, CodeCompleter->getAllocator(),                          CodeCompleter->getCodeCompletionTUInfo(),             CodeCompletionContext(CodeCompletionContext::CCC_ObjCInstanceMessage, -                                 ReceiverType, SelIdents, NumSelIdents)); +                                 ReceiverType, SelIdents));    Results.EnterNewScope(); @@ -5572,8 +5560,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,    // completion.    if (Super) {      if (ObjCMethodDecl *SuperMethod -          = AddSuperSendCompletion(*this, false, SelIdents, NumSelIdents,  -                                   Results)) +          = AddSuperSendCompletion(*this, false, SelIdents, Results))        Results.Ignore(SuperMethod);    } @@ -5592,7 +5579,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,        ReceiverType->isObjCQualifiedClassType()) {      if (ObjCMethodDecl *CurMethod = getCurMethodDecl()) {        if (ObjCInterfaceDecl *ClassDecl = CurMethod->getClassInterface()) -        AddObjCMethods(ClassDecl, false, MK_Any, SelIdents, NumSelIdents,  +        AddObjCMethods(ClassDecl, false, MK_Any, SelIdents,                         CurContext, Selectors, AtArgumentExpression, Results);      }    }  @@ -5603,7 +5590,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,      for (ObjCObjectPointerType::qual_iterator I = QualID->qual_begin(),                                                E = QualID->qual_end();            I != E; ++I) -      AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,  +      AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext,                       Selectors, AtArgumentExpression, Results);    }    // Handle messages to a pointer to interface type. @@ -5611,14 +5598,14 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,                                = ReceiverType->getAsObjCInterfacePointerType()) {      // Search the class, its superclasses, etc., for instance methods.      AddObjCMethods(IFacePtr->getInterfaceDecl(), true, MK_Any, SelIdents, -                   NumSelIdents, CurContext, Selectors, AtArgumentExpression,  +                   CurContext, Selectors, AtArgumentExpression,                     Results);      // Search protocols for instance methods.      for (ObjCObjectPointerType::qual_iterator I = IFacePtr->qual_begin(),           E = IFacePtr->qual_end();            I != E; ++I) -      AddObjCMethods(*I, true, MK_Any, SelIdents, NumSelIdents, CurContext,  +      AddObjCMethods(*I, true, MK_Any, SelIdents, CurContext,                       Selectors, AtArgumentExpression, Results);    }    // Handle messages to "id". @@ -5645,15 +5632,14 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,        for (ObjCMethodList *MethList = &M->second.first;             MethList && MethList->Method;              MethList = MethList->getNext()) { -        if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,  -                                    NumSelIdents)) +        if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))            continue;          if (!Selectors.insert(MethList->Method->getSelector()))            continue;          Result R(MethList->Method, Results.getBasePriority(MethList->Method),0); -        R.StartParameter = NumSelIdents; +        R.StartParameter = SelIdents.size();          R.AllParametersAreInformative = false;          Results.MaybeAddResult(R, CurContext);        } @@ -5669,7 +5655,7 @@ void Sema::CodeCompleteObjCInstanceMessage(Scope *S, Expr *Receiver,    // our preferred type, improving completion results.    if (AtArgumentExpression) {      QualType PreferredType = getPreferredArgumentTypeForMessageSend(Results,  -                                                                  NumSelIdents); +                                                              SelIdents.size());      if (PreferredType.isNull())        CodeCompleteOrdinaryName(S, PCC_Expression);      else @@ -5688,7 +5674,7 @@ void Sema::CodeCompleteObjCForCollection(Scope *S,    Data.ObjCCollection = true;    if (IterationVar.getAsOpaquePtr()) { -    DeclGroupRef DG = IterationVar.getAsVal<DeclGroupRef>(); +    DeclGroupRef DG = IterationVar.get();      for (DeclGroupRef::iterator I = DG.begin(), End = DG.end(); I != End; ++I) {        if (*I)          Data.IgnoreDecls.push_back(*I); @@ -5698,8 +5684,8 @@ void Sema::CodeCompleteObjCForCollection(Scope *S,    CodeCompleteExpression(S, Data);  } -void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents, -                                    unsigned NumSelIdents) { +void Sema::CodeCompleteObjCSelector(Scope *S, +                                    ArrayRef<IdentifierInfo *> SelIdents) {    // If we have an external source, load the entire class method    // pool from the AST file.    if (ExternalSource) { @@ -5722,7 +5708,7 @@ void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,         M != MEnd; ++M) {      Selector Sel = M->first; -    if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents, NumSelIdents)) +    if (!isAcceptableObjCSelector(Sel, MK_Any, SelIdents))        continue;      CodeCompletionBuilder Builder(Results.getAllocator(), @@ -5736,7 +5722,7 @@ void Sema::CodeCompleteObjCSelector(Scope *S, IdentifierInfo **SelIdents,      std::string Accumulator;      for (unsigned I = 0, N = Sel.getNumArgs(); I != N; ++I) { -      if (I == NumSelIdents) { +      if (I == SelIdents.size()) {          if (!Accumulator.empty()) {            Builder.AddInformativeChunk(Builder.getAllocator().CopyString(                                                   Accumulator)); @@ -6128,8 +6114,8 @@ void Sema::CodeCompleteObjCPropertySynthesizeIvar(Scope *S,  // Mapping from selectors to the methods that implement that selector, along  // with the "in original class" flag. -typedef llvm::DenseMap<Selector, std::pair<ObjCMethodDecl *, bool> >  -  KnownMethodsMap; +typedef llvm::DenseMap< +    Selector, llvm::PointerIntPair<ObjCMethodDecl *, 1, bool> > KnownMethodsMap;  /// \brief Find all of the methods that reside in the given container  /// (and its superclasses, protocols, etc.) that meet the given @@ -6218,7 +6204,8 @@ static void FindImplementableMethods(ASTContext &Context,            !Context.hasSameUnqualifiedType(ReturnType, M->getResultType()))          continue; -      KnownMethods[M->getSelector()] = std::make_pair(*M, InOriginalClass); +      KnownMethods[M->getSelector()] = +          KnownMethodsMap::mapped_type(*M, InOriginalClass);      }    }  } @@ -6906,7 +6893,7 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S,    }    if (!SearchDecl && S) { -    if (DeclContext *DC = static_cast<DeclContext *>(S->getEntity())) +    if (DeclContext *DC = S->getEntity())        SearchDecl = dyn_cast<ObjCContainerDecl>(DC);    } @@ -6932,7 +6919,7 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S,    for (KnownMethodsMap::iterator M = KnownMethods.begin(),                                 MEnd = KnownMethods.end();         M != MEnd; ++M) { -    ObjCMethodDecl *Method = M->second.first; +    ObjCMethodDecl *Method = M->second.getPointer();      CodeCompletionBuilder Builder(Results.getAllocator(),                                    Results.getCodeCompletionTUInfo()); @@ -7000,7 +6987,7 @@ void Sema::CodeCompleteObjCMethodDecl(Scope *S,      }      unsigned Priority = CCP_CodePattern; -    if (!M->second.second) +    if (!M->second.getInt())        Priority += CCD_InBaseClass;      Results.AddResult(Result(Builder.TakeString(), Method, Priority)); @@ -7054,8 +7041,7 @@ void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,                                                bool IsInstanceMethod,                                                bool AtParameterName,                                                ParsedType ReturnTy, -                                              IdentifierInfo **SelIdents, -                                              unsigned NumSelIdents) { +                                         ArrayRef<IdentifierInfo *> SelIdents) {    // If we have an external source, load the entire class method    // pool from the AST file.    if (ExternalSource) { @@ -7086,12 +7072,12 @@ void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,                                                         &M->second.second;           MethList && MethList->Method;            MethList = MethList->getNext()) { -      if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents,  -                                  NumSelIdents)) +      if (!isAcceptableObjCMethod(MethList->Method, MK_Any, SelIdents))          continue;        if (AtParameterName) {          // Suggest parameter names we've seen before. +        unsigned NumSelIdents = SelIdents.size();          if (NumSelIdents && NumSelIdents <= MethList->Method->param_size()) {            ParmVarDecl *Param = MethList->Method->param_begin()[NumSelIdents-1];            if (Param->getIdentifier()) { @@ -7107,7 +7093,7 @@ void Sema::CodeCompleteObjCMethodDeclSelector(Scope *S,        }        Result R(MethList->Method, Results.getBasePriority(MethList->Method), 0); -      R.StartParameter = NumSelIdents; +      R.StartParameter = SelIdents.size();        R.AllParametersAreInformative = false;        R.DeclaringEntity = true;        Results.MaybeAddResult(R, CurContext);  | 
