1 1.6 rillig /* $NetBSD: gcc.c,v 1.6 2025/07/31 17:30:52 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 c = __atomic_load_n(pc, 0); 124 1.6 rillig c = __atomic_exchange_n(pc, 0, 0); 125 1.6 rillig 126 1.6 rillig /* expect+1: warning: conversion from 'unsigned long long' to 'char' may lose accuracy [132] */ 127 1.5 rillig c = __atomic_exchange_n(pv, 0, 0); 128 1.5 rillig } 129