xref: /netbsd-src/tests/usr.bin/xlint/lint1/gcc.c (revision a644e605c1637fe174dffe39af8df4c1c51acbe0)
1*a644e605Srillig /*	$NetBSD: gcc.c,v 1.4 2024/08/29 20:35:19 rillig Exp $	*/
26f6b09efSrillig # 3 "gcc.c"
36f6b09efSrillig 
46f6b09efSrillig /*
56f6b09efSrillig  * Miscellaneous tests that are specific to lint's GCC mode.
66f6b09efSrillig  */
76f6b09efSrillig 
86f6b09efSrillig /* lint1-extra-flags: -X 351 */
96f6b09efSrillig 
106f6b09efSrillig // Before C99 introduced __func__, GCC already had __FUNCTION__ with the same
116f6b09efSrillig // semantics.
126f6b09efSrillig const char *
136f6b09efSrillig gcc_function(void)
146f6b09efSrillig {
15ae8330a3Srillig 	/* expect+1: error: negative array dimension (-13) [20] */
16ae8330a3Srillig 	typedef int size[-(int)sizeof __FUNCTION__];
176f6b09efSrillig 
186f6b09efSrillig 	return __FUNCTION__;
196f6b09efSrillig }
206f6b09efSrillig 
216f6b09efSrillig // Before C99 introduced designators in initializers, GCC already had them,
226f6b09efSrillig // although with a different syntax for struct/union members and with the
236f6b09efSrillig // a...b for ranges of array elements.
246f6b09efSrillig int array_range_initializers[256] = {
256f6b09efSrillig 	[2] = 1,
266f6b09efSrillig 	[3] = 2,
276f6b09efSrillig 	[4 ... 5] = 3
286f6b09efSrillig };
296f6b09efSrillig 
306f6b09efSrillig _Bool dbl_isinf(double);
316f6b09efSrillig 
326f6b09efSrillig // Test that the GCC '__extension__' and '__typeof' are recognized.
336f6b09efSrillig void
346f6b09efSrillig extension_and_typeof(void)
356f6b09efSrillig {
366f6b09efSrillig 	double __logbw = 1;
376f6b09efSrillig 	if (__extension__(({
386f6b09efSrillig 		__typeof((__logbw)) x_ = (__logbw);
396f6b09efSrillig 		!dbl_isinf((x_));
406f6b09efSrillig 	})))
416f6b09efSrillig 		__logbw = 1;
426f6b09efSrillig }
436f6b09efSrillig 
446f6b09efSrillig int
456f6b09efSrillig range_in_case_label(int i)
466f6b09efSrillig {
476f6b09efSrillig 	switch (i) {
486f6b09efSrillig 	case 1 ... 40:		// This is a GCC extension.
496f6b09efSrillig 		return 1;
506f6b09efSrillig 	default:
516f6b09efSrillig 		return 2;
526f6b09efSrillig 	}
536f6b09efSrillig }
54360641f9Srillig 
55360641f9Srillig union {
56360641f9Srillig 	int i;
57360641f9Srillig 	char *s;
58360641f9Srillig } initialize_union_with_mixed_designators[] = {
59360641f9Srillig 	{ i: 1 },		/* GCC-style */
60360641f9Srillig 	{ s: "foo" },		/* GCC-style */
61360641f9Srillig 	{ .i = 1 },		/* C99-style */
62360641f9Srillig 	{ .s = "foo" }		/* C99-style */
63360641f9Srillig };
64360641f9Srillig 
65360641f9Srillig union {
66360641f9Srillig 	int i[10];
67360641f9Srillig 	short s;
68360641f9Srillig } initialize_union_with_gcc_designators[] = {
69360641f9Srillig 	{ s: 2 },
70360641f9Srillig 	{ i: { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } },
71360641f9Srillig };
72360641f9Srillig 
73360641f9Srillig void
74360641f9Srillig declaration_of_variable_array(int i)
75360641f9Srillig {
76360641f9Srillig 	int array[i];
77360641f9Srillig 	while (i-- > 0)
78360641f9Srillig 		array[i] = 0;
79360641f9Srillig }
80360641f9Srillig 
81360641f9Srillig /*
82360641f9Srillig  * Before cgram.y 1.226 from 2021-05-03, lint could not parse typeof(...) if
83360641f9Srillig  * there was a statement before it.
84360641f9Srillig  */
85360641f9Srillig void *
86360641f9Srillig typeof_after_statement(void **ptr)
87360641f9Srillig {
88360641f9Srillig 	return ({
89360641f9Srillig 		if (*ptr != (void *)0)
90360641f9Srillig 			ptr++;
91360641f9Srillig 		__typeof__(*ptr) ret = *ptr;
92360641f9Srillig 		ret;
93360641f9Srillig 	});
94360641f9Srillig }
95*a644e605Srillig 
96*a644e605Srillig const char *
97*a644e605Srillig auto_type(const char *ptr)
98*a644e605Srillig {
99*a644e605Srillig 	__auto_type pp = &ptr;
100*a644e605Srillig 	return *pp;
101*a644e605Srillig }
102