blob: 2f3f0c68e28c6ffe0828abcdcf1f1ce0ce9cb370 [file] [log] [blame]
Reid Kleckner0333dd92019-05-14 18:51:07 +00001template<typename T, typename 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, double> X1;
22TwoOptionTemplate<void *, wchar_t> X2;
23TwoOptionTemplate<long, long> X3;
24TwoOptionTemplate<int, int> X4;
25TwoOptionTemplate<long, long> SingleDest;
26TwoOptionTemplate<int, double> SecondDoubleDest;
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 double 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, int> Y2;
52IntTemplateSpec<2, int> Y3;
53IntTemplateSpec<43, double> NumberDest;
54
55namespace One {
56namespace Two {
57namespace Three {
58
59template<class T>
60class Parent {};
61
62} // namespace Three
63
64} // namespace Two
65
66template<typename T, typename X>
67struct Child1: public Two::Three::Parent<unsigned> {
68 char member;
69};
70
71template<class T>
72struct Child1<T, One::Two::Three::Parent<T>> {
73 T member;
74};
75
76} // namespace One
77
78namespace Dst { One::Child1<double, One::Two::Three::Parent<double>> Z0Dst; }
79One::Child1<int, float> Z1;