1 // Tests of -fdiagnostics-show-template-tree with variadic templates
2 // { dg-options "-fdiagnostics-show-template-tree -std=c++11" }
3 
4 template<typename> struct vector {};
5 template<typename, typename> struct map {};
6 template<typename ... Types> struct var {};
7 
8 void fn_0(var<>);
9 void fn_1(var<int>);
10 void fn_2(var<int, int>);
11 void fn_3(vector<var<> >);
12 void fn_4(vector<var<int> >);
13 void fn_5(vector<var<int, int> >);
14 
test_fn_0()15 void test_fn_0 ()
16 {
17   fn_0 (var<> ());
18   fn_0 (var<int> ()); // { dg-error "could not convert .* from 'var<int>' to 'var<>'" }
19   /* { dg-begin-multiline-output "" }
20   var<
21     [int != ]>
22      { dg-end-multiline-output "" } */
23   fn_0 (var<int, int> ()); // { dg-error "could not convert .* from 'var<int, int>' to 'var<>'" }
24   /* { dg-begin-multiline-output "" }
25   var<
26     [int, int != ]>
27      { dg-end-multiline-output "" } */
28   fn_0 (vector<var<int> >()); // { dg-error "could not convert .* from 'vector<var<int> >' to 'var<>'" }
29   fn_0 (vector<var<int, int> >());  // { dg-error "could not convert .* from 'vector<var<int, int> >' to 'var<>'" }
30 }
31 
test_fn_1()32 void test_fn_1 ()
33 {
34   fn_1 (var<> ()); // { dg-error "could not convert .* from 'var<>' to 'var<int>'" }
35   /* { dg-begin-multiline-output "" }
36   var<
37     [ != int]>
38      { dg-end-multiline-output "" } */
39   fn_1 (var<int> ());
40   fn_1 (var<int, int> ()); // { dg-error "could not convert .* from 'var<int, int>' to 'var<int>'" }
41   /* { dg-begin-multiline-output "" }
42   var<
43     [int, int != int]>
44      { dg-end-multiline-output "" } */
45   fn_1 (vector<var<int> >()); // { dg-error "could not convert .* from 'vector<var<int> >' to 'var<int>'" }
46   fn_1 (vector<var<int, int> >()); // { dg-error "could not convert .* from 'vector<var<int, int> >' to 'var<int>'" }
47 }
48 
test_fn_2()49 void test_fn_2 ()
50 {
51   fn_2 (var<> ()); // { dg-error "could not convert .* from 'var<>' to 'var<int, int>'" }
52   /* { dg-begin-multiline-output "" }
53   var<
54     [ != int, int]>
55      { dg-end-multiline-output "" } */
56   fn_2 (var<int> ()); // { dg-error "could not convert .* from 'var<int>' to 'var<int, int>'" }
57   /* { dg-begin-multiline-output "" }
58   var<
59     [int != int, int]>
60      { dg-end-multiline-output "" } */
61   fn_2 (var<int, int> ());
62   fn_2 (vector<var<int> >()); // { dg-error "could not convert .* from 'vector<var<int> >' to 'var<int, int>'" }
63   fn_2 (vector<var<int, int> >()); // { dg-error "could not convert .* from 'vector<var<int, int> >' to 'var<int, int>'" }
64 }
65 
test_fn_3()66 void test_fn_3 ()
67 {
68   fn_3 (var<> ()); // { dg-error "could not convert .* from 'var<>' to 'vector<var<> >'" }
69   fn_3 (var<int> ()); // { dg-error "could not convert .* from 'var<int>' to 'vector<var<> >'" }
70   fn_3 (var<int, int> ()); // { dg-error "could not convert .* from 'var<int, int>' to 'vector<var<> >'" }
71   fn_3 (vector<var<> >());
72   fn_3 (vector<var<int> >());  // { dg-error "could not convert .* from 'vector<var<int>>' to 'vector<var<>>'" }
73   /* { dg-begin-multiline-output "" }
74   vector<
75     var<
76       [int != ]>>
77      { dg-end-multiline-output "" } */
78   fn_3 (vector<var<int, int> >()); // { dg-error "could not convert .* from 'vector<var<int, int>>' to 'vector<var<>>'" }
79   /* { dg-begin-multiline-output "" }
80   vector<
81     var<
82       [int, int != ]>>
83      { dg-end-multiline-output "" } */
84 }
85 
test_fn_4()86 void test_fn_4 ()
87 {
88   fn_4 (var<> ()); // { dg-error "could not convert .* from 'var<>' to 'vector<var<int> >'" }
89   fn_4 (var<int> ()); // { dg-error "could not convert .* from 'var<int>' to 'vector<var<int> >'" }
90   fn_4 (var<int, int> ()); // { dg-error "could not convert .* from 'var<int, int>' to 'vector<var<int> >'" }
91   fn_4 (vector<var<> >()); // { dg-error "could not convert .* from 'vector<var<>>' to 'vector<var<int>>'" }
92   /* { dg-begin-multiline-output "" }
93   vector<
94     var<
95       [ != int]>>
96      { dg-end-multiline-output "" } */
97   fn_4 (vector<var<int> >());
98   fn_4 (vector<var<int, int> >()); // { dg-error "could not convert .* from 'vector<var<int, int>>' to 'vector<var<int>>'" }
99   /* { dg-begin-multiline-output "" }
100   vector<
101     var<
102       [int, int != int]>>
103      { dg-end-multiline-output "" } */
104 }
105 
test_fn_5()106 void test_fn_5 ()
107 {
108   fn_5 (var<> ()); // { dg-error "could not convert .* from 'var<>' to 'vector<var<int, int> >'" }
109   fn_5 (var<int> ());  // { dg-error "could not convert .* from 'var<int>' to 'vector<var<int, int> >'" }
110   fn_5 (var<int, int> ());  // { dg-error "could not convert .* from 'var<int, int>' to 'vector<var<int, int> >'" }
111   fn_5 (vector<var<int> >());  // { dg-error "could not convert .* from 'vector<var<int>>' to 'vector<var<int, int>>'" }
112   /* { dg-begin-multiline-output "" }
113   vector<
114     var<
115       [int != int, int]>>
116      { dg-end-multiline-output "" } */
117   fn_5 (vector<var<int, int> >());
118 }
119