]> granicus.if.org Git - clang/commitdiff
Compute the canonical template name when building a template
authorDouglas Gregor <dgregor@apple.com>
Thu, 7 May 2009 06:49:52 +0000 (06:49 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 7 May 2009 06:49:52 +0000 (06:49 +0000)
specialization type for a dependent template name.

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

lib/Sema/SemaTemplate.cpp
test/SemaTemplate/dependent-type-identity.cpp

index 6c4adbd0ae26739570d345cae2e1cba95faaff99..e62b9a26c04fb38eaf6d253bfb97fa7b2463eac5 100644 (file)
@@ -784,9 +784,10 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
     CanonicalizeTemplateArguments(TemplateArgs, NumTemplateArgs,
                                   CanonicalTemplateArgs, Context);
 
-    // FIXME: Get the canonical template-name
+    TemplateName CanonName = Context.getCanonicalTemplateName(Name);
     QualType CanonType
-      = Context.getTemplateSpecializationType(Name, &CanonicalTemplateArgs[0],
+      = Context.getTemplateSpecializationType(CanonName, 
+                                              &CanonicalTemplateArgs[0],
                                               CanonicalTemplateArgs.size());
 
     // Build the dependent template-id type.
index 0cb5534ca50f5b8451a55ff3e4023c5c3b652700..98fc2a8c6e51f4eb5455747246ef08f2e481a833 100644 (file)
@@ -6,6 +6,7 @@ struct X0 { };
 template<typename T, typename U>
 struct X1 {
   typedef T type;
+  typedef U U_type;
 
   void f0(T); // expected-note{{previous}}
   void f0(U);
@@ -23,18 +24,14 @@ struct X1 {
   void f3(X0<U>*);
   void f3(::X0<type>*); // expected-error{{redeclar}}  
 
-  void f4(typename T::template apply<U>*);
+  void f4(typename T::template apply<U>*); // expected-note{{previous}}
   void f4(typename U::template apply<U>*);
   void f4(typename type::template apply<T>*);
-  // FIXME: this is a duplicate of the first f4, but we are not fully
-  // canonicalizing nested-name-specifiers yet.
-  void f4(typename type::template apply<U>*);
+  void f4(typename type::template apply<U_type>*); // expected-error{{redeclar}}
 
-  void f5(typename T::template apply<U>::type*);
+  void f5(typename T::template apply<U>::type*); // expected-note{{previous}}
   void f5(typename U::template apply<U>::type*);
   void f5(typename U::template apply<T>::type*);
   void f5(typename type::template apply<T>::type*);
-  // FIXME: this is a duplicate of the first f5, but we are not fully
-  // canonicalizing nested-name-specifiers yet.
-  void f5(typename type::template apply<U>::type*);
+  void f5(typename type::template apply<U_type>::type*); // expected-error{{redeclar}}
 };