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