1 1.9 rillig /* $NetBSD: c23.c,v 1.9 2024/05/07 19:32:35 rillig Exp $ */ 2 1.1 rillig # 3 "c23.c" 3 1.1 rillig 4 1.1 rillig // Tests for the option -Ac23, which allows features from C23 and all earlier 5 1.1 rillig // ISO standards, but none of the GNU extensions. 6 1.1 rillig // 7 1.1 rillig // See also: 8 1.7 rillig // c11.c 9 1.3 rillig // msg_353.c for empty initializer braces 10 1.1 rillig 11 1.1 rillig /* lint1-flags: -Ac23 -w -X 351 */ 12 1.1 rillig 13 1.9 rillig 14 1.9 rillig int 15 1.9 rillig bool_is_predefined_in_c23(void) 16 1.9 rillig { 17 1.9 rillig /* expect+1: error: syntax error 't' [249] */ 18 1.9 rillig bool t = true; 19 1.9 rillig bool f = false; 20 1.9 rillig /* expect+4: error: 't' undefined [99] */ 21 1.9 rillig /* expect+3: error: 'true' undefined [99] */ 22 1.9 rillig /* expect+2: error: 'f' undefined [99] */ 23 1.9 rillig /* expect+1: error: 'false' undefined [99] */ 24 1.9 rillig return (t == true ? 20 : 0) + (f == false ? 3 : 0); 25 1.9 rillig } 26 1.9 rillig 27 1.9 rillig int 28 1.9 rillig c99_bool_is_still_valid_in_c23(void) 29 1.9 rillig { 30 1.9 rillig _Bool t = 1; 31 1.9 rillig _Bool f = 0; 32 1.9 rillig return (t == 1 ? 20 : 0) + (f == 0 ? 3 : 0); 33 1.9 rillig } 34 1.9 rillig 35 1.9 rillig 36 1.1 rillig int 37 1.3 rillig empty_initializer_braces(void) 38 1.1 rillig { 39 1.1 rillig struct s { 40 1.1 rillig int member; 41 1.1 rillig } s; 42 1.1 rillig 43 1.2 rillig // Empty initializer braces were introduced in C23. 44 1.1 rillig s = (struct s){}; 45 1.1 rillig s = (struct s){s.member}; 46 1.1 rillig return s.member; 47 1.1 rillig } 48 1.2 rillig 49 1.7 rillig 50 1.7 rillig _Static_assert(1 > 0, "string"); 51 1.7 rillig _Static_assert(1 > 0); 52 1.7 rillig 53 1.7 rillig 54 1.2 rillig // The keyword 'thread_local' was introduced in C23. 55 1.2 rillig thread_local int globally_visible; 56 1.2 rillig 57 1.3 rillig // Thread-local functions don't make sense; lint allows them, though. 58 1.2 rillig thread_local void 59 1.2 rillig thread_local_function(void) 60 1.2 rillig { 61 1.2 rillig } 62 1.2 rillig 63 1.2 rillig void 64 1.2 rillig function(void) 65 1.2 rillig { 66 1.2 rillig // Not sure whether it makes sense to have a function-scoped 67 1.2 rillig // thread-local variable. Don't warn for now, let the compilers handle 68 1.2 rillig // this case. 69 1.2 rillig thread_local int function_scoped_thread_local; 70 1.2 rillig } 71 1.4 rillig 72 1.6 rillig // 'thread_local' can be combined with 'extern' and 'static', but with no other 73 1.6 rillig // storage classes. The other storage classes cannot be combined. 74 1.4 rillig extern thread_local int extern_thread_local_1; 75 1.4 rillig thread_local extern int extern_thread_local_2; 76 1.8 rillig /* expect+1: warning: static variable 'static_thread_local_1' unused [226] */ 77 1.6 rillig static thread_local int static_thread_local_1; 78 1.8 rillig /* expect+1: warning: static variable 'static_thread_local_2' unused [226] */ 79 1.6 rillig thread_local static int static_thread_local_2; 80