1 1.4 rillig /* $NetBSD: c23.c,v 1.4 2023/07/15 16:11:32 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.3 rillig // msg_353.c for empty initializer braces 9 1.1 rillig 10 1.1 rillig /* lint1-flags: -Ac23 -w -X 351 */ 11 1.1 rillig 12 1.1 rillig int 13 1.3 rillig empty_initializer_braces(void) 14 1.1 rillig { 15 1.1 rillig struct s { 16 1.1 rillig int member; 17 1.1 rillig } s; 18 1.1 rillig 19 1.2 rillig // Empty initializer braces were introduced in C23. 20 1.1 rillig s = (struct s){}; 21 1.1 rillig s = (struct s){s.member}; 22 1.1 rillig return s.member; 23 1.1 rillig } 24 1.2 rillig 25 1.2 rillig // The keyword 'thread_local' was introduced in C23. 26 1.2 rillig thread_local int globally_visible; 27 1.2 rillig 28 1.3 rillig // Thread-local functions don't make sense; lint allows them, though. 29 1.2 rillig thread_local void 30 1.2 rillig thread_local_function(void) 31 1.2 rillig { 32 1.2 rillig } 33 1.2 rillig 34 1.2 rillig void 35 1.2 rillig function(void) 36 1.2 rillig { 37 1.2 rillig // Not sure whether it makes sense to have a function-scoped 38 1.2 rillig // thread-local variable. Don't warn for now, let the compilers handle 39 1.2 rillig // this case. 40 1.2 rillig thread_local int function_scoped_thread_local; 41 1.2 rillig } 42 1.4 rillig 43 1.4 rillig /* FIXME: 'thread_local' and 'extern' can be combined. */ 44 1.4 rillig /* expect+1: error: only one storage class allowed [7] */ 45 1.4 rillig extern thread_local int extern_thread_local_1; 46 1.4 rillig /* FIXME: 'thread_local' and 'extern' can be combined. */ 47 1.4 rillig /* expect+1: error: only one storage class allowed [7] */ 48 1.4 rillig thread_local extern int extern_thread_local_2; 49