1*1f5207b7SJohn Levon struct s1 {
2*1f5207b7SJohn Levon 	int x;
3*1f5207b7SJohn Levon 	int y;
4*1f5207b7SJohn Levon };
5*1f5207b7SJohn Levon 
6*1f5207b7SJohn Levon struct s2 {
7*1f5207b7SJohn Levon 	int x;
8*1f5207b7SJohn Levon 	int y;
9*1f5207b7SJohn Levon } __attribute__((designated_init));
10*1f5207b7SJohn Levon 
11*1f5207b7SJohn Levon struct nest1 {
12*1f5207b7SJohn Levon 	struct s1 s1;
13*1f5207b7SJohn Levon 	struct s2 s2;
14*1f5207b7SJohn Levon };
15*1f5207b7SJohn Levon 
16*1f5207b7SJohn Levon struct nest2 {
17*1f5207b7SJohn Levon 	struct s1 s1;
18*1f5207b7SJohn Levon 	struct s2 s2;
19*1f5207b7SJohn Levon } __attribute__((designated_init));
20*1f5207b7SJohn Levon 
21*1f5207b7SJohn Levon static struct s1 s1_positional = { 5, 10 };
22*1f5207b7SJohn Levon static struct s1 s1_designated = { .x = 5, .y = 10 };
23*1f5207b7SJohn Levon static struct s2 s2_positional = { 5, 10 };
24*1f5207b7SJohn Levon static struct s2 s2_designated = { .x = 5, .y = 10 };
25*1f5207b7SJohn Levon static struct nest1 nest1_positional = {
26*1f5207b7SJohn Levon 	{ 5, 10 },
27*1f5207b7SJohn Levon 	{ 5, 10 },
28*1f5207b7SJohn Levon };
29*1f5207b7SJohn Levon static struct nest1 nest1_designated_outer = {
30*1f5207b7SJohn Levon 	.s1 = { 5, 10 },
31*1f5207b7SJohn Levon 	.s2 = { 5, 10 },
32*1f5207b7SJohn Levon };
33*1f5207b7SJohn Levon static struct nest1 nest1_designated_inner = {
34*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
35*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
36*1f5207b7SJohn Levon };
37*1f5207b7SJohn Levon static struct nest1 nest1_designated_both = {
38*1f5207b7SJohn Levon 	.s1 = { .x = 5, .y = 10 },
39*1f5207b7SJohn Levon 	.s2 = { .x = 5, .y = 10 },
40*1f5207b7SJohn Levon };
41*1f5207b7SJohn Levon static struct nest2 nest2_positional = {
42*1f5207b7SJohn Levon 	{ 5, 10 },
43*1f5207b7SJohn Levon 	{ 5, 10 },
44*1f5207b7SJohn Levon };
45*1f5207b7SJohn Levon static struct nest2 nest2_designated_outer = {
46*1f5207b7SJohn Levon 	.s1 = { 5, 10 },
47*1f5207b7SJohn Levon 	.s2 = { 5, 10 },
48*1f5207b7SJohn Levon };
49*1f5207b7SJohn Levon static struct nest2 nest2_designated_inner = {
50*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
51*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
52*1f5207b7SJohn Levon };
53*1f5207b7SJohn Levon static struct nest2 nest2_designated_both = {
54*1f5207b7SJohn Levon 	.s1 = { .x = 5, .y = 10 },
55*1f5207b7SJohn Levon 	.s2 = { .x = 5, .y = 10 },
56*1f5207b7SJohn Levon };
57*1f5207b7SJohn Levon 
58*1f5207b7SJohn Levon static struct {
59*1f5207b7SJohn Levon 	int x;
60*1f5207b7SJohn Levon 	int y;
61*1f5207b7SJohn Levon } __attribute__((designated_init))
62*1f5207b7SJohn Levon 	anon_positional = { 5, 10 },
63*1f5207b7SJohn Levon 	anon_designated = { .x = 5, .y = 10};
64*1f5207b7SJohn Levon 
65*1f5207b7SJohn Levon static struct s1 s1_array[] = {
66*1f5207b7SJohn Levon 	{ 5, 10 },
67*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
68*1f5207b7SJohn Levon };
69*1f5207b7SJohn Levon 
70*1f5207b7SJohn Levon static struct s2 s2_array[] = {
71*1f5207b7SJohn Levon 	{ 5, 10 },
72*1f5207b7SJohn Levon 	{ .x = 5, .y = 10 },
73*1f5207b7SJohn Levon };
74*1f5207b7SJohn Levon 
ret_s1_positional(void)75*1f5207b7SJohn Levon static struct s1 ret_s1_positional(void)
76*1f5207b7SJohn Levon {
77*1f5207b7SJohn Levon 	return ((struct s1){ 5, 10 });
78*1f5207b7SJohn Levon }
79*1f5207b7SJohn Levon 
ret_s1_designated(void)80*1f5207b7SJohn Levon static struct s1 ret_s1_designated(void)
81*1f5207b7SJohn Levon {
82*1f5207b7SJohn Levon 	return ((struct s1){ .x = 5, .y = 10 });
83*1f5207b7SJohn Levon }
84*1f5207b7SJohn Levon 
ret_s2_positional(void)85*1f5207b7SJohn Levon static struct s2 ret_s2_positional(void)
86*1f5207b7SJohn Levon {
87*1f5207b7SJohn Levon 	return ((struct s2){ 5, 10 });
88*1f5207b7SJohn Levon }
89*1f5207b7SJohn Levon 
ret_s2_designated(void)90*1f5207b7SJohn Levon static struct s2 ret_s2_designated(void)
91*1f5207b7SJohn Levon {
92*1f5207b7SJohn Levon 	return ((struct s2){ .x = 5, .y = 10 });
93*1f5207b7SJohn Levon }
94*1f5207b7SJohn Levon 
ret_nest1_positional(void)95*1f5207b7SJohn Levon static struct nest1 ret_nest1_positional(void)
96*1f5207b7SJohn Levon {
97*1f5207b7SJohn Levon 	return ((struct nest1){
98*1f5207b7SJohn Levon 			{ 5, 10 },
99*1f5207b7SJohn Levon 			{ 5, 10 },
100*1f5207b7SJohn Levon 		});
101*1f5207b7SJohn Levon }
102*1f5207b7SJohn Levon 
ret_nest1_designated_outer(void)103*1f5207b7SJohn Levon static struct nest1 ret_nest1_designated_outer(void)
104*1f5207b7SJohn Levon {
105*1f5207b7SJohn Levon 	return ((struct nest1){
106*1f5207b7SJohn Levon 			.s1 = { 5, 10 },
107*1f5207b7SJohn Levon 			.s2 = { 5, 10 },
108*1f5207b7SJohn Levon 		});
109*1f5207b7SJohn Levon }
110*1f5207b7SJohn Levon 
ret_nest1_designated_inner(void)111*1f5207b7SJohn Levon static struct nest1 ret_nest1_designated_inner(void)
112*1f5207b7SJohn Levon {
113*1f5207b7SJohn Levon 	return ((struct nest1){
114*1f5207b7SJohn Levon 			{ .x = 5, .y = 10 },
115*1f5207b7SJohn Levon 			{ .x = 5, .y = 10 },
116*1f5207b7SJohn Levon 		});
117*1f5207b7SJohn Levon }
118*1f5207b7SJohn Levon 
ret_nest1_designated_both(void)119*1f5207b7SJohn Levon static struct nest1 ret_nest1_designated_both(void)
120*1f5207b7SJohn Levon {
121*1f5207b7SJohn Levon 	return ((struct nest1){
122*1f5207b7SJohn Levon 			.s1 = { .x = 5, .y = 10 },
123*1f5207b7SJohn Levon 			.s2 = { .x = 5, .y = 10 },
124*1f5207b7SJohn Levon 		});
125*1f5207b7SJohn Levon }
126*1f5207b7SJohn Levon 
ret_nest2_positional(void)127*1f5207b7SJohn Levon static struct nest2 ret_nest2_positional(void)
128*1f5207b7SJohn Levon {
129*1f5207b7SJohn Levon 	return ((struct nest2){
130*1f5207b7SJohn Levon 			{ 5, 10 },
131*1f5207b7SJohn Levon 			{ 5, 10 },
132*1f5207b7SJohn Levon 		});
133*1f5207b7SJohn Levon }
134*1f5207b7SJohn Levon 
ret_nest2_designated_outer(void)135*1f5207b7SJohn Levon static struct nest2 ret_nest2_designated_outer(void)
136*1f5207b7SJohn Levon {
137*1f5207b7SJohn Levon 	return ((struct nest2){
138*1f5207b7SJohn Levon 			.s1 = { 5, 10 },
139*1f5207b7SJohn Levon 			.s2 = { 5, 10 },
140*1f5207b7SJohn Levon 		});
141*1f5207b7SJohn Levon }
142*1f5207b7SJohn Levon 
ret_nest2_designated_inner(void)143*1f5207b7SJohn Levon static struct nest2 ret_nest2_designated_inner(void)
144*1f5207b7SJohn Levon {
145*1f5207b7SJohn Levon 	return ((struct nest2){
146*1f5207b7SJohn Levon 			{ .x = 5, .y = 10 },
147*1f5207b7SJohn Levon 			{ .x = 5, .y = 10 },
148*1f5207b7SJohn Levon 		});
149*1f5207b7SJohn Levon }
150*1f5207b7SJohn Levon 
ret_nest2_designated_both(void)151*1f5207b7SJohn Levon static struct nest2 ret_nest2_designated_both(void)
152*1f5207b7SJohn Levon {
153*1f5207b7SJohn Levon 	return ((struct nest2){
154*1f5207b7SJohn Levon 			.s1 = { .x = 5, .y = 10 },
155*1f5207b7SJohn Levon 			.s2 = { .x = 5, .y = 10 },
156*1f5207b7SJohn Levon 		});
157*1f5207b7SJohn Levon }
158*1f5207b7SJohn Levon /*
159*1f5207b7SJohn Levon  * check-name: designated_init attribute
160*1f5207b7SJohn Levon  *
161*1f5207b7SJohn Levon  * check-error-start
162*1f5207b7SJohn Levon designated-init.c:23:36: warning: in initializer for s2_positional: positional init of field in struct s2, declared with attribute designated_init
163*1f5207b7SJohn Levon designated-init.c:23:39: warning: in initializer for s2_positional: positional init of field in struct s2, declared with attribute designated_init
164*1f5207b7SJohn Levon designated-init.c:27:11: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
165*1f5207b7SJohn Levon designated-init.c:27:14: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
166*1f5207b7SJohn Levon designated-init.c:31:17: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
167*1f5207b7SJohn Levon designated-init.c:31:20: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
168*1f5207b7SJohn Levon designated-init.c:42:9: warning: in initializer for nest2_positional: positional init of field in struct nest2, declared with attribute designated_init
169*1f5207b7SJohn Levon designated-init.c:43:9: warning: in initializer for nest2_positional: positional init of field in struct nest2, declared with attribute designated_init
170*1f5207b7SJohn Levon designated-init.c:43:11: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
171*1f5207b7SJohn Levon designated-init.c:43:14: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
172*1f5207b7SJohn Levon designated-init.c:47:17: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
173*1f5207b7SJohn Levon designated-init.c:47:20: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
174*1f5207b7SJohn Levon designated-init.c:50:9: warning: in initializer for nest2_designated_inner: positional init of field in struct nest2, declared with attribute designated_init
175*1f5207b7SJohn Levon designated-init.c:51:9: warning: in initializer for nest2_designated_inner: positional init of field in struct nest2, declared with attribute designated_init
176*1f5207b7SJohn Levon designated-init.c:62:29: warning: in initializer for anon_positional: positional init of field in struct <noident>, declared with attribute designated_init
177*1f5207b7SJohn Levon designated-init.c:62:32: warning: in initializer for anon_positional: positional init of field in struct <noident>, declared with attribute designated_init
178*1f5207b7SJohn Levon designated-init.c:71:11: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
179*1f5207b7SJohn Levon designated-init.c:71:14: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
180*1f5207b7SJohn Levon designated-init.c:87:30: warning: positional init of field in struct s2, declared with attribute designated_init
181*1f5207b7SJohn Levon designated-init.c:87:33: warning: positional init of field in struct s2, declared with attribute designated_init
182*1f5207b7SJohn Levon designated-init.c:99:27: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
183*1f5207b7SJohn Levon designated-init.c:99:30: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
184*1f5207b7SJohn Levon designated-init.c:107:33: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
185*1f5207b7SJohn Levon designated-init.c:107:36: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
186*1f5207b7SJohn Levon designated-init.c:130:25: warning: positional init of field in struct nest2, declared with attribute designated_init
187*1f5207b7SJohn Levon designated-init.c:131:25: warning: positional init of field in struct nest2, declared with attribute designated_init
188*1f5207b7SJohn Levon designated-init.c:131:27: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
189*1f5207b7SJohn Levon designated-init.c:131:30: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
190*1f5207b7SJohn Levon designated-init.c:139:33: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
191*1f5207b7SJohn Levon designated-init.c:139:36: warning: in initializer for s2: positional init of field in struct s2, declared with attribute designated_init
192*1f5207b7SJohn Levon designated-init.c:146:25: warning: positional init of field in struct nest2, declared with attribute designated_init
193*1f5207b7SJohn Levon designated-init.c:147:25: warning: positional init of field in struct nest2, declared with attribute designated_init
194*1f5207b7SJohn Levon  * check-error-end
195*1f5207b7SJohn Levon  */
196