Home | History | Annotate | Line # | Download | only in lint1
gcc.c revision 1.5
      1  1.5  rillig /*	$NetBSD: gcc.c,v 1.5 2025/07/31 17:26:32 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.5  rillig /* lint1-extra-flags: -chaapbrz -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  1.4  rillig 
     96  1.4  rillig const char *
     97  1.4  rillig auto_type(const char *ptr)
     98  1.4  rillig {
     99  1.4  rillig 	__auto_type pp = &ptr;
    100  1.4  rillig 	return *pp;
    101  1.4  rillig }
    102  1.5  rillig 
    103  1.5  rillig void
    104  1.5  rillig atomic_functions(void)
    105  1.5  rillig {
    106  1.5  rillig 	static unsigned long long v, *pv;
    107  1.5  rillig 	v = __atomic_load_n(pv, 0);
    108  1.5  rillig 	v = __atomic_exchange_n(pv, 0, 0);
    109  1.5  rillig 	v = __atomic_add_fetch(pv, 0, 0);
    110  1.5  rillig 	v = __atomic_sub_fetch(pv, 0, 0);
    111  1.5  rillig 	v = __atomic_and_fetch(pv, 0, 0);
    112  1.5  rillig 	v = __atomic_xor_fetch(pv, 0, 0);
    113  1.5  rillig 	v = __atomic_or_fetch(pv, 0, 0);
    114  1.5  rillig 	v = __atomic_nand_fetch(pv, 0, 0);
    115  1.5  rillig 	v = __atomic_fetch_add(pv, 0, 0);
    116  1.5  rillig 	v = __atomic_fetch_sub(pv, 0, 0);
    117  1.5  rillig 	v = __atomic_fetch_and(pv, 0, 0);
    118  1.5  rillig 	v = __atomic_fetch_xor(pv, 0, 0);
    119  1.5  rillig 	v = __atomic_fetch_or(pv, 0, 0);
    120  1.5  rillig 	v = __atomic_fetch_nand(pv, 0, 0);
    121  1.5  rillig 
    122  1.5  rillig 	static char c, *pc;
    123  1.5  rillig 	/* expect+1: warning: conversion from 'int' to 'char' may lose accuracy [132] */
    124  1.5  rillig 	c = __atomic_load_n(pc, 0);
    125  1.5  rillig 	/* expect+1: warning: conversion from 'int' to 'char' may lose accuracy [132] */
    126  1.5  rillig 	c = __atomic_exchange_n(pv, 0, 0);
    127  1.5  rillig }
    128