Good amount of refactoring. Now providing extend support for function call 
operator.


http://reviews.llvm.org/D6880

Files:
  include/clang/Sema/Sema.h
  lib/Sema/SemaCodeComplete.cpp
  lib/Sema/SemaOverload.cpp
  test/Index/complete-functor-call.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: include/clang/Sema/Sema.h
===================================================================
--- include/clang/Sema/Sema.h
+++ include/clang/Sema/Sema.h
@@ -2278,8 +2278,9 @@
   void AddFunctionCandidates(const UnresolvedSetImpl &Functions,
                       ArrayRef<Expr *> Args,
                       OverloadCandidateSet &CandidateSet,
+                      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr,
                       bool SuppressUserConversions = false,
-                      TemplateArgumentListInfo *ExplicitTemplateArgs = nullptr);
+                      bool PartialOverloading = false);
   void AddMethodCandidate(DeclAccessPair FoundDecl,
                           QualType ObjectType,
                           Expr::Classification ObjectClassification,
Index: lib/Sema/SemaCodeComplete.cpp
===================================================================
--- lib/Sema/SemaCodeComplete.cpp
+++ lib/Sema/SemaCodeComplete.cpp
@@ -3825,7 +3825,6 @@
   // results. This will do "parameter completion" solely.
 
   // FIXME: Provide support for constructors
-  // FIXME: Extend support of functors beyond bare indentifier based functors
 
   Expr *Fn = (Expr *)FnIn;
 
@@ -3845,7 +3844,7 @@
   Expr *NakedFn = Fn->IgnoreParenCasts();
   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(NakedFn))
     AddOverloadedCallCandidates(ULE, Args, CandidateSet,
-                                /*PartialOverloading=*/ true);
+                                /*PartialOverloading=*/true);
   else if (auto UnresExpr = dyn_cast<UnresolvedMemberExpr>(NakedFn)) {
     CXXMethodDecl *Method = nullptr;
     QualType ObjectType = UnresExpr->getBaseType();
@@ -3891,54 +3890,33 @@
                                    /*PartialOverloading=*/true);
       }
     }
-  } else if (auto DRE = dyn_cast<DeclRefExpr>(NakedFn)) {
-    if (auto FDecl = dyn_cast<FunctionDecl>(DRE->getDecl())) {
+  } else if (auto DC = NakedFn->getType()->getCanonicalTypeInternal()
+                       ->getAsCXXRecordDecl()) {
+    DeclarationName OpName = Context.DeclarationNames
+                             .getCXXOperatorName(OO_Call);
+    LookupResult R(*this, OpName, Loc, LookupOrdinaryName);
+    LookupQualifiedName(R, DC);
+    R.suppressDiagnostics();
+    SmallVector<Expr*, 12> ArgExprs(1, NakedFn);
+    ArgExprs.append(Args.begin(), Args.end());
+    AddFunctionCandidates(R.asUnresolvedSet(),
+                          ArgExprs,
+                          CandidateSet,
+                          /*ExplicitArgs=*/nullptr,
+                          /*SuppressUsedConversions=*/false,
+                          /*PartialOverloading=*/true);
+  } else {
+    FunctionDecl *FD = nullptr;
+    if (auto MCE = dyn_cast<MemberExpr>(NakedFn))
+      FD = dyn_cast<FunctionDecl>(MCE->getMemberDecl());
+    else if (auto DRE = dyn_cast<DeclRefExpr>(NakedFn))
+      FD = dyn_cast<FunctionDecl>(DRE->getDecl());
+    if (FD) {
       if (!getLangOpts().CPlusPlus || 
-          !FDecl->getType()->getAs<FunctionProtoType>())
-        Results.push_back(ResultCandidate(FDecl));
+          !FD->getType()->getAs<FunctionProtoType>())
+        Results.push_back(ResultCandidate(FD));
       else
-        // FIXME: access?
-        AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none),
-                             Args, CandidateSet,
-                             /*SuppressUsedConversions=*/false,
-                             /*PartialOverloading=*/true);
-    } else if (auto Record = DRE->getType()->getAs<RecordType>()) {
-      QualType ObjectType = DRE->getType();
-      Expr::Classification ObjectClassification = DRE->Classify(Context);
-      DeclarationName OpName = Context
-                               .DeclarationNames
-                               .getCXXOperatorName(OO_Call);
-
-      LookupResult R(*this, OpName, DRE->getLocEnd(), LookupOrdinaryName);
-      LookupQualifiedName(R, Record->getDecl());
-      R.suppressDiagnostics();
-      for (auto I = R.begin(), E = R.end(); I != E; ++I) {
-        NamedDecl *Func = *I;
-        CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(Func->getDeclContext());
-        if (isa<UsingShadowDecl>(Func))
-          Func = cast<UsingShadowDecl>(Func)->getTargetDecl();
-
-        if (auto Method = dyn_cast<CXXMethodDecl>(I.getDecl())) {
-          CXXRecordDecl *ActingDC = cast<CXXRecordDecl>(I.getDecl()->getDeclContext());
-          AddMethodCandidate(Method, I.getPair(), ActingDC, ObjectType,
-                             ObjectClassification, Args, CandidateSet,
-                             /*SuppressUserConversions=*/false,
-                             /*PartialOverloading=*/true);
-        } else if (auto TemplateMethod = cast<FunctionTemplateDecl>(Func)) {
-          AddMethodTemplateCandidate(TemplateMethod,
-                                     I.getPair(), ActingDC,
-                                     /*ExplicitArgs=*/nullptr,
-                                     ObjectType,  ObjectClassification,
-                                     Args, CandidateSet,
-                                     /*SuppressUsedConversions=*/false,
-                                     /*PartialOverloading=*/true);
-        }
-      }
-    }
-  } else if (auto MCE = dyn_cast<MemberExpr>(NakedFn)) {
-    if (auto FDecl = dyn_cast<FunctionDecl>(MCE->getMemberDecl())) {
-        // FIXME: access?
-        AddOverloadCandidate(FDecl, DeclAccessPair::make(FDecl, AS_none),
+        AddOverloadCandidate(FD, DeclAccessPair::make(FD, FD->getAccess()),
                              Args, CandidateSet,
                              /*SuppressUsedConversions=*/false,
                              /*PartialOverloading=*/true);
Index: lib/Sema/SemaOverload.cpp
===================================================================
--- lib/Sema/SemaOverload.cpp
+++ lib/Sema/SemaOverload.cpp
@@ -5851,34 +5851,39 @@
 void Sema::AddFunctionCandidates(const UnresolvedSetImpl &Fns,
                                  ArrayRef<Expr *> Args,
                                  OverloadCandidateSet& CandidateSet,
+                               TemplateArgumentListInfo *ExplicitTemplateArgs,
                                  bool SuppressUserConversions,
-                               TemplateArgumentListInfo *ExplicitTemplateArgs) {
+                                 bool PartialOverloading) {
   for (UnresolvedSetIterator F = Fns.begin(), E = Fns.end(); F != E; ++F) {
     NamedDecl *D = F.getDecl()->getUnderlyingDecl();
     if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
-      if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic())
+      if (isa<CXXMethodDecl>(FD) && !cast<CXXMethodDecl>(FD)->isStatic() &&
+          !isa<CXXConstructorDecl>(FD))
         AddMethodCandidate(cast<CXXMethodDecl>(FD), F.getPair(),
                            cast<CXXMethodDecl>(FD)->getParent(),
                            Args[0]->getType(), Args[0]->Classify(Context),
                            Args.slice(1), CandidateSet,
-                           SuppressUserConversions);
+                           SuppressUserConversions, PartialOverloading);
       else
         AddOverloadCandidate(FD, F.getPair(), Args, CandidateSet,
-                             SuppressUserConversions);
+                             SuppressUserConversions, PartialOverloading);
     } else {
-      FunctionTemplateDecl *FunTmpl = cast<FunctionTemplateDecl>(D);
-      if (isa<CXXMethodDecl>(FunTmpl->getTemplatedDecl()) &&
-          !cast<CXXMethodDecl>(FunTmpl->getTemplatedDecl())->isStatic())
-        AddMethodTemplateCandidate(FunTmpl, F.getPair(),
-                              cast<CXXRecordDecl>(FunTmpl->getDeclContext()),
+      FunctionTemplateDecl *FTD = cast<FunctionTemplateDecl>(D);
+      if (isa<CXXMethodDecl>(FTD->getTemplatedDecl()) &&
+          !cast<CXXMethodDecl>(FTD->getTemplatedDecl())->isStatic() &&
+          !isa<CXXConstructorDecl>(FTD->getTemplatedDecl()))
+        AddMethodTemplateCandidate(FTD, F.getPair(),
+                                   cast<CXXRecordDecl>(FTD->getDeclContext()),
                                    ExplicitTemplateArgs,
                                    Args[0]->getType(),
                                    Args[0]->Classify(Context), Args.slice(1),
-                                   CandidateSet, SuppressUserConversions);
+                                   CandidateSet, SuppressUserConversions,
+                                   PartialOverloading);
       else
-        AddTemplateOverloadCandidate(FunTmpl, F.getPair(),
+        AddTemplateOverloadCandidate(FTD, F.getPair(),
                                      ExplicitTemplateArgs, Args,
-                                     CandidateSet, SuppressUserConversions);
+                                     CandidateSet, SuppressUserConversions,
+                                     PartialOverloading);
     }
   }
 }
@@ -6074,10 +6079,18 @@
   if (TemplateDeductionResult Result
       = DeduceTemplateArguments(MethodTmpl, ExplicitTemplateArgs, Args,
                                 Specialization, Info, PartialOverloading)) {
-    OverloadCandidate &Candidate = CandidateSet.addCandidate();
+    bool ShouldAdd = PartialOverloading && Result == TDK_TooManyArguments;
+    OverloadCandidate &Candidate =
+      CandidateSet.addCandidate(ShouldAdd ? Args.size() + 1 : 0);
+    for (unsigned I = 0; I < Args.size() + 1 && ShouldAdd; ++I) {
+      // (C++ 13.3.2p2): For the purposes of overload resolution, any
+      // argument for which there is no corresponding parameter is
+      // considered to ""match the ellipsis" (C+ 13.3.3.1.3).
+      Candidate.Conversions[I].setEllipsis();
+    }
     Candidate.FoundDecl = FoundDecl;
     Candidate.Function = MethodTmpl->getTemplatedDecl();
-    Candidate.Viable = PartialOverloading && Result == TDK_TooManyArguments;
+    Candidate.Viable = ShouldAdd;
     Candidate.FailureKind = ovl_fail_bad_deduction;
     Candidate.IsSurrogate = false;
     Candidate.IgnoreObjectArgument = false;
@@ -6125,7 +6138,15 @@
   if (TemplateDeductionResult Result
         = DeduceTemplateArguments(FunctionTemplate, ExplicitTemplateArgs, Args,
                                   Specialization, Info, PartialOverloading)) {
-    OverloadCandidate &Candidate = CandidateSet.addCandidate();
+    bool ShouldAdd = PartialOverloading && Result == TDK_TooManyArguments;
+    OverloadCandidate &Candidate =
+      CandidateSet.addCandidate(ShouldAdd ? Args.size() : 0);
+    for (unsigned I = 0; I < Args.size() && ShouldAdd; ++I) {
+      // (C++ 13.3.2p2): For the purposes of overload resolution, any
+      // argument for which there is no corresponding parameter is
+      // considered to ""match the ellipsis" (C+ 13.3.3.1.3).
+      Candidate.Conversions[I].setEllipsis();
+    }
     Candidate.FoundDecl = FoundDecl;
     Candidate.Function = FunctionTemplate->getTemplatedDecl();
     Candidate.Viable = PartialOverloading && Result == TDK_TooManyArguments;
@@ -10904,7 +10925,7 @@
   OverloadCandidateSet CandidateSet(OpLoc, OverloadCandidateSet::CSK_Operator);
 
   // Add the candidates from the given function set.
-  AddFunctionCandidates(Fns, ArgsArray, CandidateSet, false);
+  AddFunctionCandidates(Fns, ArgsArray, CandidateSet);
 
   // Add operator candidates that are member functions.
   AddMemberOperatorCandidates(Op, OpLoc, ArgsArray, CandidateSet);
@@ -11113,7 +11134,7 @@
   OverloadCandidateSet CandidateSet(OpLoc, OverloadCandidateSet::CSK_Operator);
 
   // Add the candidates from the given function set.
-  AddFunctionCandidates(Fns, Args, CandidateSet, false);
+  AddFunctionCandidates(Fns, Args, CandidateSet);
 
   // Add operator candidates that are member functions.
   AddMemberOperatorCandidates(Op, OpLoc, Args, CandidateSet);
@@ -12157,8 +12178,8 @@
 
   OverloadCandidateSet CandidateSet(UDSuffixLoc,
                                     OverloadCandidateSet::CSK_Normal);
-  AddFunctionCandidates(R.asUnresolvedSet(), Args, CandidateSet, true,
-                        TemplateArgs);
+  AddFunctionCandidates(R.asUnresolvedSet(), Args, CandidateSet, TemplateArgs,
+                        /*SuppressUserConversions=*/true);
 
   bool HadMultipleCandidates = (CandidateSet.size() > 1);
 
Index: test/Index/complete-functor-call.cpp
===================================================================
--- test/Index/complete-functor-call.cpp
+++ test/Index/complete-functor-call.cpp
@@ -3,23 +3,25 @@
 
 template<class V>
 struct S {
-  void operator()(int);
-  template<class T> void operator()(T);
-  template<class T> void operator()(V, T, T);
+  void operator()(int) const {}
+  template<class T> void operator()(T) const {}
+  template<class T> void operator()(V, T, T) const {}
+  template<class T> const S<T> *operator()(const S<T> &s) const { return &s; }
 };
 
 int main() {
   S<void *> s;
   s(42);
   s(s);
   s(0, s, s);
+  (*S<void *>()(S<int>()))(42, 42, 42);
 
   s(42,);
   s(s,);
   s(0, 42, 42,);
 }
 
-// RUN: c-index-test -code-completion-at=%s:13:5 %s | FileCheck -check-prefix=CHECK-CC1 %s
+// RUN: c-index-test -code-completion-at=%s:14:5 %s | FileCheck -check-prefix=CHECK-CC1 %s
 // CHECK-CC1: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{RightParen )} (1)
 // CHECK-CC1: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter T}{RightParen )} (1)
 // CHECK-CC1: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
@@ -33,7 +35,7 @@
 // CHECK-CC1-NEXT: Nested name specifier
 // CHECK-CC1-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:14:5 %s | FileCheck -check-prefix=CHECK-CC2 %s
+// RUN: c-index-test -code-completion-at=%s:15:5 %s | FileCheck -check-prefix=CHECK-CC2 %s
 // CHECK-CC2: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{RightParen )} (1)
 // CHECK-CC2: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter T}{RightParen )} (1)
 // CHECK-CC2: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
@@ -47,7 +49,7 @@
 // CHECK-CC2-NEXT: Nested name specifier
 // CHECK-CC2-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:15:5 %s | FileCheck -check-prefix=CHECK-CC3 %s
+// RUN: c-index-test -code-completion-at=%s:16:5 %s | FileCheck -check-prefix=CHECK-CC3 %s
 // CHECK-CC3: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{RightParen )} (1)
 // CHECK-CC3: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter T}{RightParen )} (1)
 // CHECK-CC3: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
@@ -61,9 +63,10 @@
 // CHECK-CC3-NEXT: Nested name specifier
 // CHECK-CC3-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:15:7 %s | FileCheck -check-prefix=CHECK-CC4 %s
-// CHECK-CC4: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// RUN: c-index-test -code-completion-at=%s:16:7 %s | FileCheck -check-prefix=CHECK-CC4 %s
 // CHECK-CC4: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text void *}{Comma , }{CurrentParameter T}{Comma , }{Text T}{RightParen )} (1)
+// CHECK-CC4: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC4: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{Text const S<T> &s}{RightParen )} (1)
 // CHECK-CC4: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
 // CHECK-CC4: Completion contexts:
 // CHECK-CC4-NEXT: Any type
@@ -75,9 +78,10 @@
 // CHECK-CC4-NEXT: Nested name specifier
 // CHECK-CC4-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:15:10 %s | FileCheck -check-prefix=CHECK-CC5 %s
-// CHECK-CC5: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// RUN: c-index-test -code-completion-at=%s:16:10 %s | FileCheck -check-prefix=CHECK-CC5 %s
 // CHECK-CC5: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text void *}{Comma , }{Text S<void *>}{Comma , }{CurrentParameter S<void *>}{RightParen )} (1)
+// CHECK-CC5: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC5: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{Text const S<T> &s}{RightParen )} (1)
 // CHECK-CC5: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
 // CHECK-CC5: Completion contexts:
 // CHECK-CC5-NEXT: Any type
@@ -89,9 +93,11 @@
 // CHECK-CC5-NEXT: Nested name specifier
 // CHECK-CC5-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:17:8 %s | FileCheck -check-prefix=CHECK-CC6 %s
-// CHECK-CC6: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
-// CHECK-CC6: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// RUN: c-index-test -code-completion-at=%s:17:17 %s | FileCheck -check-prefix=CHECK-CC6 %s
+// CHECK-CC6: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{RightParen )} (1)
+// CHECK-CC6: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter T}{RightParen )} (1)
+// CHECK-CC6: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
+// CHECK-CC6: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{CurrentParameter const S<T> &s}{RightParen )} (1)
 // CHECK-CC6: Completion contexts:
 // CHECK-CC6-NEXT: Any type
 // CHECK-CC6-NEXT: Any value
@@ -102,9 +108,11 @@
 // CHECK-CC6-NEXT: Nested name specifier
 // CHECK-CC6-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:18:7 %s | FileCheck -check-prefix=CHECK-CC7 %s
-// CHECK-CC7: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
-// CHECK-CC7: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// RUN: c-index-test -code-completion-at=%s:17:28 %s | FileCheck -check-prefix=CHECK-CC7 %s
+// CHECK-CC7: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{RightParen )} (1)
+// CHECK-CC7: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter T}{RightParen )} (1)
+// CHECK-CC7: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{CurrentParameter int}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
+// CHECK-CC7: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{CurrentParameter const S<T> &s}{RightParen )} (1)
 // CHECK-CC7: Completion contexts:
 // CHECK-CC7-NEXT: Any type
 // CHECK-CC7-NEXT: Any value
@@ -115,9 +123,10 @@
 // CHECK-CC7-NEXT: Nested name specifier
 // CHECK-CC7-NEXT: Objective-C interface
 
-// RUN: c-index-test -code-completion-at=%s:19:15 %s | FileCheck -check-prefix=CHECK-CC8 %s
+// RUN: c-index-test -code-completion-at=%s:17:31 %s | FileCheck -check-prefix=CHECK-CC8 %s
+// CHECK-CC8: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{Comma , }{CurrentParameter T}{Comma , }{Text T}{RightParen )} (1)
 // CHECK-CC8: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
-// CHECK-CC8: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
+// CHECK-CC8: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{Text const S<T> &s}{RightParen )} (1)
 // CHECK-CC8: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
 // CHECK-CC8: Completion contexts:
 // CHECK-CC8-NEXT: Any type
@@ -128,3 +137,58 @@
 // CHECK-CC8-NEXT: Class name
 // CHECK-CC8-NEXT: Nested name specifier
 // CHECK-CC8-NEXT: Objective-C interface
+
+// RUN: c-index-test -code-completion-at=%s:17:35 %s | FileCheck -check-prefix=CHECK-CC9 %s
+// CHECK-CC9: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{Comma , }{Text int}{Comma , }{CurrentParameter int}{RightParen )} (1)
+// CHECK-CC9: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC9: NotImplemented:{ResultType const S<T> *}{Text operator()}{LeftParen (}{Text const S<T> &s}{RightParen )} (1)
+// CHECK-CC9: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// CHECK-CC9: Completion contexts:
+// CHECK-CC9-NEXT: Any type
+// CHECK-CC9-NEXT: Any value
+// CHECK-CC9-NEXT: Enum tag
+// CHECK-CC9-NEXT: Union tag
+// CHECK-CC9-NEXT: Struct tag
+// CHECK-CC9-NEXT: Class name
+// CHECK-CC9-NEXT: Nested name specifier
+// CHECK-CC9-NEXT: Objective-C interface
+
+// RUN: c-index-test -code-completion-at=%s:19:8 %s | FileCheck -check-prefix=CHECK-CC10 %s
+// CHECK-CC10: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC10: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// CHECK-CC10: Completion contexts:
+// CHECK-CC10-NEXT: Any type
+// CHECK-CC10-NEXT: Any value
+// CHECK-CC10-NEXT: Enum tag
+// CHECK-CC10-NEXT: Union tag
+// CHECK-CC10-NEXT: Struct tag
+// CHECK-CC10-NEXT: Class name
+// CHECK-CC10-NEXT: Nested name specifier
+// CHECK-CC10-NEXT: Objective-C interface
+
+// RUN: c-index-test -code-completion-at=%s:20:7 %s | FileCheck -check-prefix=CHECK-CC11 %s
+// CHECK-CC11: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC11: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// CHECK-CC11: Completion contexts:
+// CHECK-CC11-NEXT: Any type
+// CHECK-CC11-NEXT: Any value
+// CHECK-CC11-NEXT: Enum tag
+// CHECK-CC11-NEXT: Union tag
+// CHECK-CC11-NEXT: Struct tag
+// CHECK-CC11-NEXT: Class name
+// CHECK-CC11-NEXT: Nested name specifier
+// CHECK-CC11-NEXT: Objective-C interface
+
+// RUN: c-index-test -code-completion-at=%s:21:15 %s | FileCheck -check-prefix=CHECK-CC12 %s
+// CHECK-CC12: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text T}{RightParen )} (1)
+// CHECK-CC12: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text void *}{Comma , }{Text T}{Comma , }{Text T}{RightParen )} (1)
+// CHECK-CC12: NotImplemented:{ResultType void}{Text operator()}{LeftParen (}{Text int}{RightParen )} (1)
+// CHECK-CC12: Completion contexts:
+// CHECK-CC12-NEXT: Any type
+// CHECK-CC12-NEXT: Any value
+// CHECK-CC12-NEXT: Enum tag
+// CHECK-CC12-NEXT: Union tag
+// CHECK-CC12-NEXT: Struct tag
+// CHECK-CC12-NEXT: Class name
+// CHECK-CC12-NEXT: Nested name specifier
+// CHECK-CC12-NEXT: Objective-C interface
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to