1 // { dg-do compile { target arm_eabi } }
2 // { dg-options "-Wpsabi" }
3
4 #include <stdarg.h>
5
6 template <int N>
7 struct A { double p; };
8
9 A<0> v;
10
11 template <int N>
12 struct B
13 {
14 typedef A<N> T;
15 int i, j;
16 };
17
18 struct C : public B<0> {};
19 struct D {};
20 struct E : public D, C {};
21 struct F : public B<1> {};
22 struct G : public F { static double y; };
23 struct H : public G {};
24 struct I : public D { long long z; };
25 struct J : public D { static double z; int i, j; };
26
27 template <int N>
28 struct K : public D { typedef A<N> T; int i, j; };
29
30 struct L { static double h; int i, j; };
31
32 int
fn1(int a,B<0> b)33 fn1 (int a, B<0> b) // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" }
34 {
35 return a + b.i;
36 }
37
38 int
fn2(int a,B<1> b)39 fn2 (int a, B<1> b)
40 {
41 return a + b.i;
42 }
43
44 int
fn3(int a,L b)45 fn3 (int a, L b) // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" }
46 {
47 return a + b.i;
48 }
49
50 int
fn4(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,B<0> n,...)51 fn4 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, B<0> n, ...)
52 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
53 {
54 va_list ap;
55 va_start (ap, n);
56 int x = va_arg (ap, int);
57 va_end (ap);
58 return x;
59 }
60
61 int
fn5(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,B<1> n,...)62 fn5 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, B<1> n, ...)
63 {
64 va_list ap;
65 va_start (ap, n);
66 int x = va_arg (ap, int);
67 va_end (ap);
68 return x;
69 }
70
71 int
fn6(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,C n,...)72 fn6 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, C n, ...)
73 {
74 va_list ap;
75 va_start (ap, n);
76 int x = va_arg (ap, int);
77 va_end (ap);
78 return x;
79 }
80
81 int
fn7(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,E n,...)82 fn7 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, E n, ...)
83 {
84 va_list ap;
85 va_start (ap, n);
86 int x = va_arg (ap, int);
87 va_end (ap);
88 return x;
89 }
90
91 int
fn8(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,H n,...)92 fn8 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, H n, ...)
93 {
94 va_list ap;
95 va_start (ap, n);
96 int x = va_arg (ap, int);
97 va_end (ap);
98 return x;
99 }
100
101 int
fn9(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,I n,...)102 fn9 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, I n, ...)
103 {
104 va_list ap;
105 va_start (ap, n);
106 int x = va_arg (ap, int);
107 va_end (ap);
108 return x;
109 }
110
111 int
fn10(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,J n,...)112 fn10 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, J n, ...)
113 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
114 {
115 va_list ap;
116 va_start (ap, n);
117 int x = va_arg (ap, int);
118 va_end (ap);
119 return x;
120 }
121
122 int
fn11(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,K<0> n,...)123 fn11 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, K<0> n, ...)
124 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
125 {
126 va_list ap;
127 va_start (ap, n);
128 int x = va_arg (ap, int);
129 va_end (ap);
130 return x;
131 }
132
133 int
fn12(int a,int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l,int m,K<2> n,...)134 fn12 (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, K<2> n, ...)
135 {
136 va_list ap;
137 va_start (ap, n);
138 int x = va_arg (ap, int);
139 va_end (ap);
140 return x;
141 }
142
143 void
test()144 test ()
145 {
146 static B<0> b0;
147 static B<1> b1;
148 static L l;
149 static C c;
150 static E e;
151 static H h;
152 static I i;
153 static J j;
154 static K<0> k0;
155 static K<2> k2;
156 fn1 (1, b0); // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" }
157 fn2 (1, b1);
158 fn3 (1, l); // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" }
159 fn4 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, b0, 1, 2, 3, 4);
160 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
161 fn5 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, b1, 1, 2, 3, 4);
162 fn6 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, c, 1, 2, 3, 4);
163 fn7 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, e, 1, 2, 3, 4);
164 fn8 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, h, 1, 2, 3, 4);
165 fn9 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, i, 1, 2, 3, 4);
166 fn10 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, j, 1, 2, 3, 4);
167 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
168 fn11 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, k0, 1, 2, 3, 4);
169 // { dg-message "note: parameter passing for argument of type \[^\n\r]* changed in GCC 7\.1" "" { target *-*-* } .-1 }
170 fn12 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, k2, 1, 2, 3, 4);
171 }
172