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