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