]> granicus.if.org Git - clang/commitdiff
In C++ code completion, only suggest the "template" keyword after ".",
authorDouglas Gregor <dgregor@apple.com>
Fri, 18 Sep 2009 23:55:56 +0000 (23:55 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 18 Sep 2009 23:55:56 +0000 (23:55 +0000)
"->", or "::" if we will be looking into a dependent context. It's not
wrong to use the "template" keyword, but it's to needed, either.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82307 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/CodeCompleteConsumer.cpp
test/CodeCompletion/nested-name-specifier.cpp

index 8c8d6a18318e23eb3d15156bb311f726441d5c1a..2e3d5cd88ebd66aab07adfbaea2df4f4f76812dc 100644 (file)
@@ -116,9 +116,22 @@ CodeCompleteConsumer::CodeCompleteMemberReferenceExpr(Scope *S,
     NextRank = CollectMemberLookupResults(Record->getDecl(), NextRank, Results);
 
     if (getSema().getLangOptions().CPlusPlus) {
-      if (!Results.empty())
+      if (!Results.empty()) {
         // The "template" keyword can follow "->" or "." in the grammar.
-        Results.MaybeAddResult(Result("template", NextRank++));
+        // However, we only want to suggest the template keyword if something
+        // is dependent.
+        bool IsDependent = BaseType->isDependentType();
+        if (!IsDependent) {
+          for (Scope *DepScope = S; DepScope; DepScope = DepScope->getParent())
+            if (DeclContext *Ctx = (DeclContext *)DepScope->getEntity()) {
+              IsDependent = Ctx->isDependentContext();
+              break;
+            }
+        }
+        
+        if (IsDependent)
+          Results.MaybeAddResult(Result("template", NextRank++));
+      }
 
       // We could have the start of a nested-name-specifier. Add those
       // results as well.
@@ -177,8 +190,9 @@ CodeCompleteConsumer::CodeCompleteQualifiedId(Scope *S,
   ResultSet Results(*this);
   unsigned NextRank = CollectMemberLookupResults(Ctx, 0, Results);
   
-  // The "template" keyword can follow "::" in the grammar
-  if (!Results.empty())
+  // The "template" keyword can follow "::" in the grammar, but only
+  // put it into the grammar if the nested-name-specifier is dependent.
+  if (!Results.empty() && NNS->isDependent())
     Results.MaybeAddResult(Result("template", NextRank));
   
   ProcessCodeCompleteResults(Results.data(), Results.size());
index f418164b0246dace4df0c2fbed9615da13eaadc1..4d6a75f8cbe5d8ad72045a5f322c99e2c14b8db4 100644 (file)
@@ -15,5 +15,4 @@ namespace N {
 // CHECK-CC1: A : 0
 // CHECK-CC1: B : 0
 // CHECK-CC1: M : 0
-// CHECK-CC1: template : 0
 N::
\ No newline at end of file