1 1.8 rillig /* $NetBSD: c23.c,v 1.8 2024/01/28 08:17:27 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.1 rillig int 14 1.3 rillig empty_initializer_braces(void) 15 1.1 rillig { 16 1.1 rillig struct s { 17 1.1 rillig int member; 18 1.1 rillig } s; 19 1.1 rillig 20 1.2 rillig // Empty initializer braces were introduced in C23. 21 1.1 rillig s = (struct s){}; 22 1.1 rillig s = (struct s){s.member}; 23 1.1 rillig return s.member; 24 1.1 rillig } 25 1.2 rillig 26 1.7 rillig 27 1.7 rillig _Static_assert(1 > 0, "string"); 28 1.7 rillig _Static_assert(1 > 0); 29 1.7 rillig 30 1.7 rillig 31 1.2 rillig // The keyword 'thread_local' was introduced in C23. 32 1.2 rillig thread_local int globally_visible; 33 1.2 rillig 34 1.3 rillig // Thread-local functions don't make sense; lint allows them, though. 35 1.2 rillig thread_local void 36 1.2 rillig thread_local_function(void) 37 1.2 rillig { 38 1.2 rillig } 39 1.2 rillig 40 1.2 rillig void 41 1.2 rillig function(void) 42 1.2 rillig { 43 1.2 rillig // Not sure whether it makes sense to have a function-scoped 44 1.2 rillig // thread-local variable. Don't warn for now, let the compilers handle 45 1.2 rillig // this case. 46 1.2 rillig thread_local int function_scoped_thread_local; 47 1.2 rillig } 48 1.4 rillig 49 1.6 rillig // 'thread_local' can be combined with 'extern' and 'static', but with no other 50 1.6 rillig // storage classes. The other storage classes cannot be combined. 51 1.4 rillig extern thread_local int extern_thread_local_1; 52 1.4 rillig thread_local extern int extern_thread_local_2; 53 1.8 rillig /* expect+1: warning: static variable 'static_thread_local_1' unused [226] */ 54 1.6 rillig static thread_local int static_thread_local_1; 55 1.8 rillig /* expect+1: warning: static variable 'static_thread_local_2' unused [226] */ 56 1.6 rillig thread_local static int static_thread_local_2; 57