]> granicus.if.org Git - clang/commitdiff
Teach code completion to instantiate templates when it needs to
authorDouglas Gregor <dgregor@apple.com>
Fri, 11 Dec 2009 18:28:39 +0000 (18:28 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 11 Dec 2009 18:28:39 +0000 (18:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91138 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaCodeComplete.cpp
test/CodeCompletion/templates.cpp

index cfede40aacf9a8b0ea05ba876c278831a822352d..f186165551435084fa3e00a4ac8861b466fec856 100644 (file)
@@ -1740,7 +1740,12 @@ void Sema::CodeCompleteQualifiedId(Scope *S, const CXXScopeSpec &SS,
   DeclContext *Ctx = computeDeclContext(SS, EnteringContext);
   if (!Ctx)
     return;
-  
+
+  // Try to instantiate any non-dependent declaration contexts before
+  // we look in them.
+  if (!isDependentScopeSpecifier(SS) && RequireCompleteDeclContext(SS))
+    return;
+
   ResultBuilder Results(*this);
   unsigned NextRank = CollectMemberLookupResults(Ctx, 0, Ctx, Results);
   
index 5a0bdb19f15c0ef640173701504b859b70139202..ff5611823d728f3ddef92f2b395e8d4cc848ce30 100644 (file)
@@ -1,16 +1,28 @@
 namespace std {
   template<typename T>
-  class allocator;
+  class allocator { 
+  public:
+    void in_base();
+  };
   
-  template<typename T, typename Alloc = std::allocator<T> > class vector;
+  template<typename T, typename Alloc = std::allocator<T> >
+  class vector : Alloc {
+  public:
+    void foo();
+    void stop();
+  };
   template<typename Alloc> class vector<bool, Alloc>;
 }
 
 void f() {
-  std::
-  // RUN: clang-cc -fsyntax-only -code-completion-at=%s:10:8 %s -o - | FileCheck -check-prefix=CC1 %s
+  std::vector<int> v;
+  v.foo();
+  // RUN: clang-cc -fsyntax-only -code-completion-at=%s:18:8 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s
   // CHECK-CC1: allocator<<#typename T#>>
   // CHECK-CC1-NEXT: vector<<#typename T#>{#, <#typename Alloc#>#}>
-  
+  // RUN: clang-cc -fsyntax-only -code-completion-at=%s:19:5 %s -o - | FileCheck -check-prefix=CHECK-CC2 %s
+  // CHECK-CC2: foo
+  // CHECK-CC2: in_base
+  // CHECK-CC2: stop