c11.c revision 1.4
11.4Srillig/* $NetBSD: c11.c,v 1.4 2023/07/28 22:05:44 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.4Srillig/* lint1-flags: -Ac11 -w -X 192,231,236,351 */ 101.1Srillig 111.1Srillig_Noreturn void exit(int); 121.1Srilligvoid _Noreturn exit(int); 131.1Srillig 141.1Srillig_Noreturn void 151.1Srillignoreturn_before_type(void) 161.1Srillig{ 171.1Srillig exit(0); 181.1Srillig} 191.1Srillig 201.1Srilligvoid _Noreturn 211.1Srillignoreturn_after_type(void) 221.1Srillig{ 231.1Srillig exit(0); 241.1Srillig} 251.1Srillig 261.1Srilligstatic _Noreturn void 271.1Srillignoreturn_after_storage_class(void) 281.1Srillig{ 291.1Srillig exit(0); 301.1Srillig} 311.1Srillig 321.1Srillig_Noreturn static void 331.1Srillignoreturn_before_storage_class(void) 341.1Srillig{ 351.1Srillig exit(0); 361.1Srillig} 371.1Srillig 381.1Srillig/* C11 6.7.4p5: A function specifier may appear more than once. */ 391.1Srillig_Noreturn _Noreturn _Noreturn void 401.1Srilligthree_times(void) 411.1Srillig{ 421.1Srillig exit(0); 431.1Srillig} 441.2Srillig 451.4Srillig 461.4Srillig_Static_assert(1 > 0, "string"); 471.4Srillig/* XXX: requires C23 or later */ 481.4Srillig_Static_assert(1 > 0); 491.4Srillig 501.4Srillig 511.4Srillig// C11 6.7.6.1p3 521.4Srilligconst int *ptr_to_constant; 531.4Srilligint *const constant_ptr; 541.4Srillig 551.4Srillig// C11 6.7.6.1p4 561.4Srilligtypedef int *int_ptr; 571.4Srilligconst int_ptr constant_ptr; 581.4Srillig 591.4Srillig// C11 6.7.6.2p7 601.4Srilligfloat fa[11], *afp[17]; 611.4Srillig 621.4Srillig// C11 6.7.6.2p8 631.4Srilligextern int *x; 641.4Srilligextern int y[]; 651.4Srillig 661.4Srillig// C11 6.7.6.2p9 671.4Srilligextern int n; 681.4Srilligextern int m; 691.4Srilligvoid fcompat(void) 701.4Srillig{ 711.4Srillig int a[n][6][m]; 721.4Srillig int (*p)[4][n+1]; 731.4Srillig int c[n][n][6][m]; 741.4Srillig int (*r)[n][n][n+1]; 751.4Srillig /* expect+2: warning: 'p' set but not used in function 'fcompat' [191] */ 761.4Srillig /* expect+1: warning: illegal combination of 'pointer to array[4] of array[1] of int' and 'pointer to array[6] of array[1] of int', op '=' [124] */ 771.4Srillig p = a; 781.4Srillig /* expect+2: warning: 'r' set but not used in function 'fcompat' [191] */ 791.4Srillig /* expect+1: warning: illegal 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] */ 801.4Srillig r = c; 811.4Srillig} 821.4Srillig 831.4Srillig// C11 6.7.6.2p10 841.4Srilligextern int n; 851.4Srilligint A[n]; 861.4Srilligextern int (*p2)[n]; 871.4Srilligint B[100]; 881.4Srilligvoid fvla(int m, int C[m][m]); 891.4Srilligvoid fvla(int m, int C[m][m]) 901.4Srillig{ 911.4Srillig typedef int VLA[m][m]; 921.4Srillig struct tag { 931.4Srillig int (*y)[n]; 941.4Srillig int z[n]; 951.4Srillig }; 961.4Srillig int D[m]; 971.4Srillig static int E[m]; 981.4Srillig /* expect+1: warning: nested 'extern' declaration of 'F' [352] */ 991.4Srillig extern int F[m]; 1001.4Srillig int (*s)[m]; 1011.4Srillig /* expect+1: warning: nested 'extern' declaration of 'r' [352] */ 1021.4Srillig extern int (*r)[m]; 1031.4Srillig /* expect+2: warning: illegal combination of 'pointer to array[1] of int' and 'pointer to int', op 'init' [124] */ 1041.4Srillig /* expect+1: warning: 'q' set but not used in function 'fvla' [191] */ 1051.4Srillig static int (*q)[m] = &B; 1061.4Srillig} 1071.4Srillig 1081.4Srillig// C11 6.7.6.3p15 1091.4Srilligint f(void), *fip(), (*pfi)(); 1101.4Srillig 1111.4Srillig// C11 6.7.6.3p17 1121.4Srilligint (*apfi[3])(int *x, int *y); 1131.4Srillig 1141.4Srillig// C11 6.7.6.3p18 1151.4Srilligint (*fpfi(int (*)(long), int))(int, ...); 1161.4Srillig 1171.4Srillig// C11 6.7.6.3p19 1181.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x); 1191.4Srilligint main(void) 1201.4Srillig{ 1211.4Srillig double b[4][308]; 1221.4Srillig /* expect+1: warning: converting 'pointer to array[308] of double' to incompatible 'pointer to array[1] of double' for argument 3 [153] */ 1231.4Srillig addscalar(4, 2, b, 2.17); 1241.4Srillig return 0; 1251.4Srillig} 1261.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x) 1271.4Srillig{ 1281.4Srillig for (int i = 0; i < n; i++) 1291.4Srillig for (int j = 0, k = n*m+300; j < k; j++) 1301.4Srillig a[i][j] += x; 1311.4Srillig} 1321.4Srillig 1331.4Srillig// C11 6.7.6.3p20 1341.4Srilligdouble maximum(int n, int m, double a[n][m]); 1351.4Srillig/* expect+1: error: null dimension [17] */ 1361.4Srilligdouble maximum(int n, int m, double a[*][*]); 1371.4Srillig/* expect+1: error: null dimension [17] */ 1381.4Srilligdouble maximum(int n, int m, double a[ ][*]); 1391.4Srilligdouble maximum(int n, int m, double a[ ][m]); 1401.4Srillig 1411.4Srilligvoid f1(double (* restrict a)[5]); 1421.4Srilligvoid f2(double a[restrict][5]); 1431.4Srillig/* expect+1: error: syntax error '3' [249] */ 1441.4Srilligvoid f3(double a[restrict 3][5]); 1451.4Srilligvoid f4(double a[restrict static 3][5]); 1461.4Srillig 1471.4Srillig 1481.3Srillig// In C11 mode, 'thread_local' is not yet known, but '_Thread_local' is. 1491.3Srillig/* expect+2: error: old-style declaration; add 'int' [1] */ 1501.3Srillig/* expect+1: error: syntax error 'int' [249] */ 1511.3Srilligthread_local int thread_local_variable_c23; 1521.3Srillig_Thread_local int thread_local_variable_c11; 1531.3Srillig 1541.2Srillig/* The '_Noreturn' must not appear after the declarator. */ 1551.2Srilligvoid _Noreturn exit(int) _Noreturn; 1561.2Srillig/* expect-1: error: formal parameter #1 lacks name [59] */ 1571.2Srillig/* expect-2: warning: empty declaration [2] */ 1581.2Srillig/* expect+2: error: syntax error '' [249] */ 1591.2Srillig/* expect+1: error: cannot recover from previous errors [224] */ 160