diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-10 22:57:19 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-10 22:57:19 +0000 |
commit | e362cea5681e97c5606154558a3f2555511de9ee (patch) | |
tree | c5177f2edbb943bf6b2f393470141380e905e70b /clang/test/SemaTemplate/injected-class-name.cpp | |
parent | b8f9b7a965756c532cbcd1ffdac05675fe65af39 (diff) | |
download | bcm5719-llvm-e362cea5681e97c5606154558a3f2555511de9ee.tar.gz bcm5719-llvm-e362cea5681e97c5606154558a3f2555511de9ee.zip |
Implement the semantics of the injected-class-name within a class
template. The injected-class-name is either a type or a template,
depending on whether a '<' follows it. As a type, the
injected-class-name's template argument list contains its template
parameters in declaration order.
As part of this, add logic for canonicalizing declarations, and be
sure to canonicalize declarations used in template names and template
arguments.
A TagType is dependent if the declaration it references is dependent.
I'm not happy about the rather complicated protocol needed to use
ASTContext::getTemplateSpecializationType.
llvm-svn: 71408
Diffstat (limited to 'clang/test/SemaTemplate/injected-class-name.cpp')
-rw-r--r-- | clang/test/SemaTemplate/injected-class-name.cpp | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/clang/test/SemaTemplate/injected-class-name.cpp b/clang/test/SemaTemplate/injected-class-name.cpp index 43fb454bca5..c5f826d849c 100644 --- a/clang/test/SemaTemplate/injected-class-name.cpp +++ b/clang/test/SemaTemplate/injected-class-name.cpp @@ -1,5 +1,4 @@ // RUN: clang-cc -fsyntax-only -verify %s - template<typename T> struct X { X<T*> *ptr; @@ -13,5 +12,29 @@ struct X<int***> { }; // FIXME: EDG rejects this in their strict-conformance mode, but I -// don't see any wording making this ill-formed. +// don't see any wording making this ill-formed. Actually, +// [temp.local]p2 might make it ill-formed. Are we "in the scope of +// the class template specialization?" X<float>::X<int> xi = x; + +// [temp.local]p1: + +// FIXME: test non-type and template template parameters +template<typename T, typename U> +struct X0 { + typedef T type; + typedef U U_type; + typedef U_type U_type2; + + void f0(const X0&); // expected-note{{here}} + void f0(X0&); + void f0(const X0<T, U>&); // expected-error{{redecl}} + + void f1(const X0&); // expected-note{{here}} + void f1(X0&); + void f1(const X0<type, U_type2>&); // expected-error{{redecl}} + + void f2(const X0&); // expected-note{{here}} + void f2(X0&); + void f2(const ::X0<type, U_type2>&); // expected-error{{redecl}} +}; |