| // RUN: clang-cc -fsyntax-only -verify %s |
| template<typename T> |
| struct X { |
| X<T*> *ptr; |
| }; |
| |
| X<int> x; |
| |
| template<> |
| struct X<int***> { |
| typedef X<int***> *ptr; |
| }; |
| |
| // FIXME: EDG rejects this in their strict-conformance mode, but I |
| // 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}} |
| }; |