gcc.c revision 1.3 1 /* $NetBSD: gcc.c,v 1.3 2024/06/08 13:50:47 rillig Exp $ */
2 # 3 "gcc.c"
3
4 /*
5 * Miscellaneous tests that are specific to lint's GCC mode.
6 */
7
8 /* lint1-extra-flags: -X 351 */
9
10 // Before C99 introduced __func__, GCC already had __FUNCTION__ with the same
11 // semantics.
12 const char *
13 gcc_function(void)
14 {
15 /* expect+1: error: negative array dimension (-13) [20] */
16 typedef int size[-(int)sizeof __FUNCTION__];
17
18 return __FUNCTION__;
19 }
20
21 // Before C99 introduced designators in initializers, GCC already had them,
22 // although with a different syntax for struct/union members and with the
23 // a...b for ranges of array elements.
24 int array_range_initializers[256] = {
25 [2] = 1,
26 [3] = 2,
27 [4 ... 5] = 3
28 };
29
30 _Bool dbl_isinf(double);
31
32 // Test that the GCC '__extension__' and '__typeof' are recognized.
33 void
34 extension_and_typeof(void)
35 {
36 double __logbw = 1;
37 if (__extension__(({
38 __typeof((__logbw)) x_ = (__logbw);
39 !dbl_isinf((x_));
40 })))
41 __logbw = 1;
42 }
43
44 int
45 range_in_case_label(int i)
46 {
47 switch (i) {
48 case 1 ... 40: // This is a GCC extension.
49 return 1;
50 default:
51 return 2;
52 }
53 }
54
55 union {
56 int i;
57 char *s;
58 } initialize_union_with_mixed_designators[] = {
59 { i: 1 }, /* GCC-style */
60 { s: "foo" }, /* GCC-style */
61 { .i = 1 }, /* C99-style */
62 { .s = "foo" } /* C99-style */
63 };
64
65 union {
66 int i[10];
67 short s;
68 } initialize_union_with_gcc_designators[] = {
69 { s: 2 },
70 { i: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } },
71 };
72
73 void
74 declaration_of_variable_array(int i)
75 {
76 int array[i];
77 while (i-- > 0)
78 array[i] = 0;
79 }
80
81 /*
82 * Before cgram.y 1.226 from 2021-05-03, lint could not parse typeof(...) if
83 * there was a statement before it.
84 */
85 void *
86 typeof_after_statement(void **ptr)
87 {
88 return ({
89 if (*ptr != (void *)0)
90 ptr++;
91 __typeof__(*ptr) ret = *ptr;
92 ret;
93 });
94 }
95