]> granicus.if.org Git - clang/commitdiff
Eliminate redundant nested-name-specifiers on
authorDouglas Gregor <dgregor@apple.com>
Thu, 3 Mar 2011 17:04:51 +0000 (17:04 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 3 Mar 2011 17:04:51 +0000 (17:04 +0000)
TemplateSpecializationTypes, which also fixes PR9388.

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

lib/AST/ASTContext.cpp
test/Index/annotate-nested-name-specifier.cpp
test/SemaCXX/nested-name-spec-locations.cpp

index 5335a8b0c88edf52f918abffba576223923ca7fc..3fd58ce9fdf0f763a09b89ab0f4eba448dd9a516 100644 (file)
@@ -2230,6 +2230,9 @@ ASTContext::getTemplateSpecializationType(TemplateName Template,
                                           QualType Canon) const {
   assert(!Template.getAsDependentTemplateName() && 
          "No dependent template names here!");
+  // Look through qualified template names.
+  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
+    Template = TemplateName(QTN->getTemplateDecl());
   
   if (!Canon.isNull())
     Canon = getCanonicalType(Canon);
@@ -2257,6 +2260,9 @@ ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
                                                    unsigned NumArgs) const {
   assert(!Template.getAsDependentTemplateName() && 
          "No dependent template names here!");
+  // Look through qualified template names.
+  if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
+    Template = TemplateName(QTN->getTemplateDecl());
   
   // Build the canonical template specialization type.
   TemplateName CanonTemplate = getCanonicalTemplateName(Template);
@@ -4387,6 +4393,8 @@ TemplateName
 ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
                                      bool TemplateKeyword,
                                      TemplateDecl *Template) const {
+  assert(NNS && "Missing nested-name-specifier in qualified template name");
+  
   // FIXME: Canonicalization?
   llvm::FoldingSetNodeID ID;
   QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
index b7570d97e171e322c1a36aeb2df6aeda2f67e0b8..35642ebc1def4beedaf91cb5516735dffa7b782c 100644 (file)
@@ -149,9 +149,9 @@ struct X9 : X8 {
 
 // Base specifiers
 // CHECK: Identifier: "outer_alias" [16:19 - 16:30] NamespaceRef=outer_alias:10:11
-// CHECK: Punctuation: "::" [16:30 - 16:32] C++ base class specifier=outer_alias::inner::outer_alias::inner::vector<struct X>:4:12 [access=public isVirtual=false]
+// CHECK: Punctuation: "::" [16:30 - 16:32] C++ base class specifier=outer_alias::inner::vector<struct X>:4:12 [access=public isVirtual=false]
 // CHECK: Identifier: "inner" [16:32 - 16:37] NamespaceRef=inner:2:13
-// CHECK: Punctuation: "::" [16:37 - 16:39] C++ base class specifier=outer_alias::inner::outer_alias::inner::vector<struct X>:4:12 [access=public isVirtual=false]
+// CHECK: Punctuation: "::" [16:37 - 16:39] C++ base class specifier=outer_alias::inner::vector<struct X>:4:12 [access=public isVirtual=false]
 // CHECK: Identifier: "vector" [16:39 - 16:45] TemplateRef=vector:4:12
 // CHECK: Punctuation: "<" [16:45 - 16:46] C++ base class specifier=outer_alias::inner::outer_alias::inner::vector<struct X>:4:12 [access=public isVirtual=false]
 // CHECK: Identifier: "X" [16:46 - 16:47] TypeRef=struct X:12:8
index 6398e249a4fe2e7b91fda5747fa03d65f212a806..048d4baf135bf0e8f5c9f806cbbe785e812341cc 100644 (file)
@@ -146,3 +146,17 @@ struct DependentTemplateTemplateArgumentTester {
 };
 
 DependentTemplateTemplateArgumentTester<HasApply, int> DTTACheck; // expected-note{{in instantiation of template class}}
+
+namespace PR9388 {
+  namespace std {
+    template<typename T>     class vector     {
+    };
+  }
+  template<typename T> static void foo(std::vector<T*> &V) {
+    __PRETTY_FUNCTION__; // expected-warning{{expression result unused}}
+  }
+  void bar(std::vector<int*> &Blocks) {
+    foo(Blocks); // expected-note{{in instantiation of}}
+  }
+
+}