]>
git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/testsuite/gcc.dg/c2x-typeof-1.c
1 /* Test C2x typeof and typeof_unqual. Valid code. */
3 /* { dg-options "-std=c2x -pedantic-errors" } */
8 extern typeof_unqual (i
) i
;
9 extern typeof_unqual (int) i
;
12 extern typeof (volatile int) vi
;
13 extern typeof (vi
) vi
;
15 extern typeof_unqual (volatile int) i
;
16 extern typeof_unqual (vi
) i
;
17 extern typeof ((const int) vi
) i
;
18 extern typeof ((volatile int) vi
) i
;
21 extern typeof (const int) ci
;
22 extern typeof (ci
) ci
;
24 extern typeof_unqual (const int) i
;
25 extern typeof_unqual (ci
) i
;
26 extern typeof ((const int) ci
) i
;
27 extern typeof (+ci
) i
;
28 extern typeof (0, ci
) i
;
29 extern typeof (1 ? ci
: ci
) i
;
33 extern typeof (fci ()) i
;
36 extern typeof (_Atomic
int) ai
;
37 extern typeof (_Atomic (int)) ai
;
38 extern typeof (ai
) ai
;
40 extern typeof_unqual (_Atomic
int) i
;
41 extern typeof_unqual (_Atomic (int)) i
;
42 extern typeof_unqual (ai
) i
;
43 extern typeof (+ai
) i
;
44 extern typeof ((_Atomic
int) ai
) i
;
45 extern typeof (0, ai
) i
;
46 extern typeof (1 ? ai
: ai
) i
;
48 _Atomic
int fai (void);
49 extern typeof (fai ()) i
;
51 _Atomic
const volatile int acvi
;
52 extern typeof (int volatile const _Atomic
) acvi
;
53 extern typeof (acvi
) acvi
;
54 extern const _Atomic
volatile typeof (acvi
) acvi
;
55 extern _Atomic
volatile typeof (ci
) acvi
;
56 extern _Atomic
const typeof (vi
) acvi
;
57 extern const typeof (ai
) volatile acvi
;
59 extern typeof_unqual (acvi
) i
;
60 extern typeof_unqual (typeof (acvi
)) i
;
61 extern typeof_unqual (_Atomic
typeof_unqual (acvi
)) i
;
63 extern _Atomic
typeof_unqual (acvi
) ai
;
68 volatile char *const cpvc
;
70 const char *volatile vpcc
;
73 extern typeof (*cpvc
) vc
;
74 extern typeof_unqual (*cpvc
) c
;
75 extern typeof_unqual (cpvc
) pvc
;
76 extern typeof_unqual (vpcc
) pcc
;
79 extern typeof (++vi
) i
;
80 extern typeof (++ai
) i
;
81 extern typeof (--vi
) i
;
82 extern typeof (--ai
) i
;
83 extern typeof (vi
++) i
;
84 extern typeof (ai
++) i
;
85 extern typeof (vi
--) i
;
86 extern typeof (ai
--) i
;
91 extern typeof (++vb
) b
;
92 extern typeof (++ab
) b
;
93 extern typeof (--vb
) b
;
94 extern typeof (--ab
) b
;
95 extern typeof (vb
++) b
;
96 extern typeof (ab
++) b
;
97 extern typeof (vb
--) b
;
98 extern typeof (ab
--) b
;
100 extern typeof (vc
= 1) c
;
101 extern typeof (vpcc
= 0) pcc
;
102 extern typeof (ai
*= 2) i
;
104 int s
= sizeof (typeof (int (*)[++i
]));
108 /* The non-returning property of a function is not part of the type given by
110 _Noreturn
void nf1 (void);
111 [[noreturn
]] void nf2 (void);
113 typeof (&nf1
) pnf1
= fg
;
114 typeof (&nf2
) pnf2
= fg
;
115 extern void (*pnf1
) (void);
116 extern void (*pnf2
) (void);
117 extern typeof (nf1
) *pnf1
;
118 extern typeof (nf1
) *pnf2
;
119 extern typeof (nf2
) *pnf1
;
120 extern typeof (nf2
) *pnf2
;
121 typeof (*&nf1
) fg2
, fg2a
, fg2b
;
122 typeof (*&nf2
) fg3
, fg3a
, fg3b
;
123 typeof (nf1
) fg4
, fg4a
, fg4b
;
124 typeof (nf2
) fg5
, fg5a
, fg5b
;
126 extern void abort (void);
127 extern void exit (int);
130 _Noreturn
void fg2a (void) { abort (); }
131 [[noreturn
]] void fg2b (void) { abort (); }
133 _Noreturn
void fg3a (void) { abort (); }
134 [[noreturn
]] void fg3b (void) { abort (); }
136 _Noreturn
void fg4a (void) { abort (); }
137 [[noreturn
]] void fg4b (void) { abort (); }
139 _Noreturn
void fg5a (void) { abort (); }
140 [[noreturn
]] void fg5b (void) { abort (); }
142 extern int only_used_in_typeof
;
144 static int not_defined (void);
149 volatile typeof (only_used_in_typeof
) ii
= 2;
152 const typeof (not_defined ()) jj
= 3;
157 typeof (int (*)[++u2
]) p
= 0;
160 if (sizeof (*p
) != sizeof (int))
162 typeof_unqual (int (*)[++u2
]) q
= 0;
165 if (sizeof (*q
) != 2 * sizeof (int))
167 if (sizeof (*p
) != sizeof (int))
169 typeof (++u2
) u3
= 1;
172 typeof_unqual (++u2
) u4
= 2;
175 u
= sizeof (typeof (int (*)[++u2
]));
178 u
= sizeof (typeof_unqual (int (*)[++u2
]));
181 typeof ((int (*)[++u2
]) 0) q2
;
184 typeof ((void) 0, (int (*)[++u2
]) 0) q3
;
187 typeof ((int (*)[++u2
]) 0, 0) q4
;
190 typeof_unqual ((int (*)[++u2
]) 0) q5
;
193 typeof_unqual ((void) 0, (int (*)[++u2
]) 0) q6
;
196 typeof_unqual ((int (*)[++u2
]) 0, 0) q7
;
201 typeof (pa
= &a2
) pp
;
204 typeof_unqual (pa
= &a1
) pp2
;