Home | History | Annotate | Line # | Download | only in lint1
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