blob: 43606d4d220bba6beb9b69e328e9ebf2d0352886 [file] [log] [blame]
Aleksei Sidorindaf82f62017-01-23 09:45:29 +00001template<typename T, class P>
2struct TwoOptionTemplate {};
3
4template<typename T>
5struct TwoOptionTemplate<T, char> {
6 int member;
7};
8
9
10template<typename T>
11struct TwoOptionTemplate<T, double> {
12 float member;
13};
14
15template<typename T>
16struct TwoOptionTemplate<T, T> {
17 T** member;
18};
19
20TwoOptionTemplate<int, char> X0;
21TwoOptionTemplate<int, float> X1;
22TwoOptionTemplate<void *, wchar_t> X2;
23TwoOptionTemplate<long, long> X3;
24TwoOptionTemplate<float, float> X4;
25TwoOptionTemplate<long, long> SingleSource;
26TwoOptionTemplate<char, double> SecondDoubleSource;
27
28
29template<int I, class C>
30struct IntTemplateSpec {};
31
32template<class C>
33struct IntTemplateSpec<4, C> {
34 C member;
35};
36
37template<int I>
38struct IntTemplateSpec<I, void *> {
39 int member;
40 static constexpr int val = I;
41};
42
43template<int I>
44struct IntTemplateSpec<I, double> {
45 char member;
46 static constexpr int val = I;
47};
48
49IntTemplateSpec<4, wchar_t> Y0;
50IntTemplateSpec<5, void *> Y1;
51IntTemplateSpec<1, long> Y2;
52IntTemplateSpec<3, int> Y3;
53//template<int I> constexpr int IntTemplateSpec<I, double>::val;
54IntTemplateSpec<42, double> NumberSource;
55static_assert(NumberSource.val == 42);
56
57namespace One {
58namespace Two {
59 // Just an empty namespace to ensure we can deal with multiple namespace decls.
60}
61}
62
63
64namespace One {
65namespace Two {
66namespace Three {
67
68template<class T>
69class Parent {};
70
71} // namespace Three
72
73} // namespace Two
74
75template<typename T, typename X>
76struct Child1: public Two::Three::Parent<unsigned> {
77 char member;
78};
79
80template<class T>
81struct Child1<T, One::Two::Three::Parent<T>> {
82 T member;
83};
84
85} // namespace One
86
87One::Child1<int, double> Z0Source;
88
89// Test import of nested namespace specifiers
90template<typename T>
91struct Outer {
92 template<typename U> class Inner0;
93};
94
95template<typename X>
96template<typename Y>
97class Outer<X>::Inner0 {
98public:
99 void f(X, Y);
100 template<typename Z> struct Inner1;
101};
102
103template<typename X>
104template<typename Y>
105void Outer<X>::Inner0<Y>::f(X, Y) {}
106
107template<typename X>
108template<typename Y>
109template<typename Z>
110class Outer<X>::Inner0<Y>::Inner1 {
111public:
112 void f(Y, Z);
113};
114
115template<typename X>
116template<typename Y>
117template<typename Z>
118void Outer<X>::Inner0<Y>::Inner1<Z>::f(Y, Z) {}