aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-05-07 06:49:52 +0000
committerDouglas Gregor <dgregor@apple.com>2009-05-07 06:49:52 +0000
commit45fbaf02fb94a9bc6a108c9621d3db0092d11e94 (patch)
tree02ece4e86fdf56d63c3774d42d26b5537afe5e7d
parent25a3ef7cc5fd55dc8cc67c6e6770c8595657e082 (diff)
Compute the canonical template name when building a template
specialization type for a dependent template name. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71153 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Sema/SemaTemplate.cpp5
-rw-r--r--test/SemaTemplate/dependent-type-identity.cpp13
2 files changed, 8 insertions, 10 deletions
diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp
index 6c4adbd0ae..e62b9a26c0 100644
--- a/lib/Sema/SemaTemplate.cpp
+++ b/lib/Sema/SemaTemplate.cpp
@@ -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.
diff --git a/test/SemaTemplate/dependent-type-identity.cpp b/test/SemaTemplate/dependent-type-identity.cpp
index 0cb5534ca5..98fc2a8c6e 100644
--- a/test/SemaTemplate/dependent-type-identity.cpp
+++ b/test/SemaTemplate/dependent-type-identity.cpp
@@ -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}}
};