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