xref: /netbsd-src/tests/usr.bin/xlint/lint1/gcc.c (revision a644e605c1637fe174dffe39af8df4c1c51acbe0)
1 /*	$NetBSD: gcc.c,v 1.4 2024/08/29 20:35:19 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 
96 const char *
97 auto_type(const char *ptr)
98 {
99 	__auto_type pp = &ptr;
100 	return *pp;
101 }
102