diff options
| author | Roman Divacky <rdivacky@FreeBSD.org> | 2010-01-23 11:10:26 +0000 |
|---|---|---|
| committer | Roman Divacky <rdivacky@FreeBSD.org> | 2010-01-23 11:10:26 +0000 |
| commit | 5044f5c816adfd5cba17f1adee1a10127296d0bf (patch) | |
| tree | c69d3f4f13d508570bb5257a6aea735f88bdf09c /test/SemaTemplate | |
| parent | ee791dde723a2089c681d2ab6a9d4f96379d5f49 (diff) | |
Notes
Diffstat (limited to 'test/SemaTemplate')
| -rw-r--r-- | test/SemaTemplate/dependent-base-classes.cpp | 28 | ||||
| -rw-r--r-- | test/SemaTemplate/dependent-base-member-init.cpp | 23 | ||||
| -rw-r--r-- | test/SemaTemplate/dependent-expr.cpp | 19 | ||||
| -rw-r--r-- | test/SemaTemplate/friend-template.cpp | 18 | ||||
| -rw-r--r-- | test/SemaTemplate/instantiate-local-class.cpp | 34 | ||||
| -rw-r--r-- | test/SemaTemplate/member-template-access-expr.cpp | 20 |
6 files changed, 141 insertions, 1 deletions
diff --git a/test/SemaTemplate/dependent-base-classes.cpp b/test/SemaTemplate/dependent-base-classes.cpp index 79b28c2239fe..80d20b09b82a 100644 --- a/test/SemaTemplate/dependent-base-classes.cpp +++ b/test/SemaTemplate/dependent-base-classes.cpp @@ -82,3 +82,31 @@ namespace Ambig { Derived<int> di; // expected-note{{instantiation of}} } + +namespace PR6081 { + template<typename T> + struct A { }; + + template<typename T> + class B : public A<T> + { + public: + template< class X > + void f0(const X & k) + { + this->template f1<int>()(k); + } + }; + + template<typename T> + class C + { + public: + template< class X > + void f0(const X & k) + { + this->template f1<int>()(k); // expected-error{{'f1' following the 'template' keyword does not refer to a template}} \ + // FIXME: expected-error{{unqualified-id}} + } + }; +} diff --git a/test/SemaTemplate/dependent-base-member-init.cpp b/test/SemaTemplate/dependent-base-member-init.cpp index c9823d227d4c..1f131491e621 100644 --- a/test/SemaTemplate/dependent-base-member-init.cpp +++ b/test/SemaTemplate/dependent-base-member-init.cpp @@ -34,3 +34,26 @@ template<typename T> struct s1 : s0<typename s0_traits<T>::t0> { s1() {} }; +// PR6062 +namespace PR6062 { + template <typename T> + class A : public T::type + { + A() : T::type() + { + } + + template <typename U> + A(U const& init) + : T::type(init) + { } + + template<typename U> + A(U& init) : U::other_type(init) { } + }; +} + +template<typename T, typename U> +struct X0 : T::template apply<U> { + X0(int i) : T::template apply<U>(i) { } +}; diff --git a/test/SemaTemplate/dependent-expr.cpp b/test/SemaTemplate/dependent-expr.cpp index 412a811f7292..3f481b513691 100644 --- a/test/SemaTemplate/dependent-expr.cpp +++ b/test/SemaTemplate/dependent-expr.cpp @@ -5,3 +5,22 @@ template <typename Iterator> void Test(Iterator it) { *(it += 1); } + +namespace PR6045 { + template<unsigned int r> + class A + { + static const unsigned int member = r; + void f(); + }; + + template<unsigned int r> + const unsigned int A<r>::member; + + template<unsigned int r> + void A<r>::f() + { + unsigned k; + (void)(k % member); + } +} diff --git a/test/SemaTemplate/friend-template.cpp b/test/SemaTemplate/friend-template.cpp index 05289b10d26c..8bc2631e119f 100644 --- a/test/SemaTemplate/friend-template.cpp +++ b/test/SemaTemplate/friend-template.cpp @@ -1,5 +1,4 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s - // PR5057 namespace test0 { namespace std { @@ -107,3 +106,20 @@ namespace test5 { template <typename T> friend struct cache; }; } + +// PR6022 +namespace PR6022 { + template <class T1, class T2 , class T3 > class A; + + namespace inner { + template<class T1, class T2, class T3, class T> + A<T1, T2, T3>& f0(A<T1, T2, T3>&, T); + } + + template<class T1, class T2, class T3> + class A { + template<class U1, class U2, class U3, class T> + friend A<U1, U2, U3>& inner::f0(A<U1, U2, U3>&, T); + }; +} + diff --git a/test/SemaTemplate/instantiate-local-class.cpp b/test/SemaTemplate/instantiate-local-class.cpp new file mode 100644 index 000000000000..768eb2170a15 --- /dev/null +++ b/test/SemaTemplate/instantiate-local-class.cpp @@ -0,0 +1,34 @@ +// RUN: %clang_cc1 -verify %s +template<typename T> +void f0() { + struct X; + typedef struct Y { + T (X::* f1())(int) { return 0; } + } Y2; + + Y2 y = Y(); +} + +template void f0<int>(); + +// PR5764 +namespace PR5764 { + class X { + template <typename T> + void Bar() { + typedef T ValueType; + class Y { + Y() { V = ValueType(); } + + ValueType V; + }; + + Y y; + } + }; + + void test(X x) { + x.Bar<int>(); + } +} + diff --git a/test/SemaTemplate/member-template-access-expr.cpp b/test/SemaTemplate/member-template-access-expr.cpp index 9edefe8b63e0..ea17cdbb5864 100644 --- a/test/SemaTemplate/member-template-access-expr.cpp +++ b/test/SemaTemplate/member-template-access-expr.cpp @@ -103,3 +103,23 @@ struct X5 { this->f<T*>(); } }; + +namespace PR6021 { + template< class T1, class T2 > + class Outer + { + public: // Range operations + template< class X > X tmpl( const X* = 0 ) const; + + struct Inner + { + const Outer& o; + + template< class X > + operator X() const + { + return o.tmpl<X>(); + } + }; + }; +} |
