11.11Srillig/* $NetBSD: c11.c,v 1.11 2025/09/18 18:22:18 rillig Exp $ */ 21.1Srillig# 3 "c11.c" 31.1Srillig 41.1Srillig/* 51.1Srillig * Test the language level C11, which adds _Generic expressions, _Noreturn 61.1Srillig * functions, anonymous struct/union members, and several more. 71.1Srillig */ 81.1Srillig 91.11Srillig/* lint1-flags: -Ac11 -hw -X 192,231,236,351 */ 101.1Srillig 111.7Srillig 121.7Srilligint 131.7Srilligbool_is_predefined_in_c23(void) 141.7Srillig{ 151.7Srillig /* expect+1: error: syntax error 't' [249] */ 161.7Srillig bool t = true; 171.7Srillig bool f = false; 181.7Srillig /* expect+4: error: 't' undefined [99] */ 191.7Srillig /* expect+3: error: 'true' undefined [99] */ 201.7Srillig /* expect+2: error: 'f' undefined [99] */ 211.7Srillig /* expect+1: error: 'false' undefined [99] */ 221.7Srillig return (t == true ? 20 : 0) + (f == false ? 3 : 0); 231.7Srillig} 241.7Srillig 251.7Srilligint 261.7Srilligc99_bool_is_still_valid_in_c23(void) 271.7Srillig{ 281.7Srillig _Bool t = 1; 291.7Srillig _Bool f = 0; 301.7Srillig return (t == 1 ? 20 : 0) + (f == 0 ? 3 : 0); 311.7Srillig} 321.7Srillig 331.7Srillig 341.1Srillig_Noreturn void exit(int); 351.1Srilligvoid _Noreturn exit(int); 361.1Srillig 371.1Srillig_Noreturn void 381.1Srillignoreturn_before_type(void) 391.1Srillig{ 401.1Srillig exit(0); 411.1Srillig} 421.1Srillig 431.1Srilligvoid _Noreturn 441.1Srillignoreturn_after_type(void) 451.1Srillig{ 461.1Srillig exit(0); 471.1Srillig} 481.1Srillig 491.1Srilligstatic _Noreturn void 501.1Srillignoreturn_after_storage_class(void) 511.1Srillig{ 521.1Srillig exit(0); 531.1Srillig} 541.1Srillig 551.1Srillig_Noreturn static void 561.1Srillignoreturn_before_storage_class(void) 571.1Srillig{ 581.1Srillig exit(0); 591.1Srillig} 601.1Srillig 611.1Srillig/* C11 6.7.4p5: A function specifier may appear more than once. */ 621.1Srillig_Noreturn _Noreturn _Noreturn void 631.1Srilligthree_times(void) 641.1Srillig{ 651.1Srillig exit(0); 661.1Srillig} 671.2Srillig 681.4Srillig 691.5Srilligstruct static_assert_tag { 701.5Srillig _Static_assert(1 > 0, "string"); 711.5Srillig int member; 721.5Srillig}; 731.4Srillig 741.4Srillig 751.4Srillig// C11 6.7.6.1p3 761.4Srilligconst int *ptr_to_constant; 771.4Srilligint *const constant_ptr; 781.4Srillig 791.4Srillig// C11 6.7.6.1p4 801.4Srilligtypedef int *int_ptr; 811.4Srilligconst int_ptr constant_ptr; 821.4Srillig 831.4Srillig// C11 6.7.6.2p7 841.4Srilligfloat fa[11], *afp[17]; 851.4Srillig 861.4Srillig// C11 6.7.6.2p8 871.4Srilligextern int *x; 881.4Srilligextern int y[]; 891.4Srillig 901.4Srillig// C11 6.7.6.2p9 911.4Srilligextern int n; 921.4Srilligextern int m; 931.4Srilligvoid fcompat(void) 941.4Srillig{ 951.4Srillig int a[n][6][m]; 961.4Srillig int (*p)[4][n+1]; 971.4Srillig int c[n][n][6][m]; 981.4Srillig int (*r)[n][n][n+1]; 991.10Srillig /* expect+1: warning: invalid combination of 'pointer to array[4] of array[1] of int' and 'pointer to array[6] of array[1] of int', op '=' [124] */ 1001.4Srillig p = a; 1011.10Srillig /* expect+1: warning: invalid combination of 'pointer to array[1] of array[1] of array[1] of int' and 'pointer to array[1] of array[6] of array[1] of int', op '=' [124] */ 1021.4Srillig r = c; 1031.4Srillig} 1041.4Srillig 1051.4Srillig// C11 6.7.6.2p10 1061.4Srilligextern int n; 1071.4Srilligint A[n]; 1081.4Srilligextern int (*p2)[n]; 1091.4Srilligint B[100]; 1101.4Srilligvoid fvla(int m, int C[m][m]); 1111.4Srilligvoid fvla(int m, int C[m][m]) 1121.4Srillig{ 1131.4Srillig typedef int VLA[m][m]; 1141.4Srillig struct tag { 1151.4Srillig int (*y)[n]; 1161.4Srillig int z[n]; 1171.4Srillig }; 1181.4Srillig int D[m]; 1191.4Srillig static int E[m]; 1201.4Srillig /* expect+1: warning: nested 'extern' declaration of 'F' [352] */ 1211.4Srillig extern int F[m]; 1221.4Srillig int (*s)[m]; 1231.4Srillig /* expect+1: warning: nested 'extern' declaration of 'r' [352] */ 1241.4Srillig extern int (*r)[m]; 1251.10Srillig /* expect+1: warning: invalid combination of 'pointer to array[1] of int' and 'pointer to array[100] of int', op 'init' [124] */ 1261.4Srillig static int (*q)[m] = &B; 1271.4Srillig} 1281.4Srillig 1291.4Srillig// C11 6.7.6.3p15 1301.11Srillig/* expect+2: warning: function declaration is not a prototype [287] */ 1311.11Srillig/* expect+1: warning: function declaration is not a prototype [287] */ 1321.4Srilligint f(void), *fip(), (*pfi)(); 1331.4Srillig 1341.4Srillig// C11 6.7.6.3p17 1351.4Srilligint (*apfi[3])(int *x, int *y); 1361.4Srillig 1371.4Srillig// C11 6.7.6.3p18 1381.4Srilligint (*fpfi(int (*)(long), int))(int, ...); 1391.4Srillig 1401.4Srillig// C11 6.7.6.3p19 1411.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x); 1421.4Srilligint main(void) 1431.4Srillig{ 1441.4Srillig double b[4][308]; 1451.4Srillig /* expect+1: warning: converting 'pointer to array[308] of double' to incompatible 'pointer to array[1] of double' for argument 3 [153] */ 1461.4Srillig addscalar(4, 2, b, 2.17); 1471.4Srillig return 0; 1481.4Srillig} 1491.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x) 1501.4Srillig{ 1511.4Srillig for (int i = 0; i < n; i++) 1521.4Srillig for (int j = 0, k = n*m+300; j < k; j++) 1531.4Srillig a[i][j] += x; 1541.4Srillig} 1551.4Srillig 1561.4Srillig// C11 6.7.6.3p20 1571.4Srilligdouble maximum(int n, int m, double a[n][m]); 1581.4Srillig/* expect+1: error: null dimension [17] */ 1591.4Srilligdouble maximum(int n, int m, double a[*][*]); 1601.4Srillig/* expect+1: error: null dimension [17] */ 1611.4Srilligdouble maximum(int n, int m, double a[ ][*]); 1621.4Srilligdouble maximum(int n, int m, double a[ ][m]); 1631.4Srillig 1641.4Srilligvoid f1(double (* restrict a)[5]); 1651.4Srilligvoid f2(double a[restrict][5]); 1661.11Srillig/* expect+2: error: syntax error '3' [249] */ 1671.11Srillig/* expect+1: warning: function declaration is not a prototype [287] */ 1681.4Srilligvoid f3(double a[restrict 3][5]); 1691.4Srilligvoid f4(double a[restrict static 3][5]); 1701.4Srillig 1711.4Srillig 1721.8Srilligint _Alignas(double) int_aligned_as_double; 1731.8Srillig 1741.8Srillig 1751.11Srillig// C23 6.7.7.4p13 says that "()" is equivalent to "(void)". 1761.11Srillig// In C11 6.7.6.3p14, "()" means "no information about the number of types". 1771.11Srillig/* expect+1: warning: function declaration is not a prototype [287] */ 1781.11Srilligvoid function_without_parameters(); 1791.11Srillig 1801.11Srillig 1811.3Srillig// In C11 mode, 'thread_local' is not yet known, but '_Thread_local' is. 1821.3Srillig/* expect+2: error: old-style declaration; add 'int' [1] */ 1831.3Srillig/* expect+1: error: syntax error 'int' [249] */ 1841.3Srilligthread_local int thread_local_variable_c23; 1851.3Srillig_Thread_local int thread_local_variable_c11; 1861.3Srillig 1871.2Srillig/* The '_Noreturn' must not appear after the declarator. */ 1881.6Srillig/* expect+2: error: formal parameter #1 lacks name [59] */ 1891.6Srillig/* expect+1: warning: empty declaration [2] */ 1901.2Srilligvoid _Noreturn exit(int) _Noreturn; 1911.2Srillig/* expect+2: error: syntax error '' [249] */ 1921.2Srillig/* expect+1: error: cannot recover from previous errors [224] */ 193