c11.c revision 1.5
11.5Srillig/*	$NetBSD: c11.c,v 1.5 2023/08/03 18:48:42 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.5Srilligstruct static_assert_tag {
471.5Srillig	_Static_assert(1 > 0, "string");
481.5Srillig	int member;
491.5Srillig};
501.4Srillig
511.4Srillig
521.4Srillig// C11 6.7.6.1p3
531.4Srilligconst int *ptr_to_constant;
541.4Srilligint *const constant_ptr;
551.4Srillig
561.4Srillig// C11 6.7.6.1p4
571.4Srilligtypedef int *int_ptr;
581.4Srilligconst int_ptr constant_ptr;
591.4Srillig
601.4Srillig// C11 6.7.6.2p7
611.4Srilligfloat fa[11], *afp[17];
621.4Srillig
631.4Srillig// C11 6.7.6.2p8
641.4Srilligextern int *x;
651.4Srilligextern int y[];
661.4Srillig
671.4Srillig// C11 6.7.6.2p9
681.4Srilligextern int n;
691.4Srilligextern int m;
701.4Srilligvoid fcompat(void)
711.4Srillig{
721.4Srillig	int a[n][6][m];
731.4Srillig	int (*p)[4][n+1];
741.4Srillig	int c[n][n][6][m];
751.4Srillig	int (*r)[n][n][n+1];
761.4Srillig	/* expect+2: warning: 'p' set but not used in function 'fcompat' [191] */
771.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] */
781.4Srillig	p = a;
791.4Srillig	/* expect+2: warning: 'r' set but not used in function 'fcompat' [191] */
801.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] */
811.4Srillig	r = c;
821.4Srillig}
831.4Srillig
841.4Srillig// C11 6.7.6.2p10
851.4Srilligextern int n;
861.4Srilligint A[n];
871.4Srilligextern int (*p2)[n];
881.4Srilligint B[100];
891.4Srilligvoid fvla(int m, int C[m][m]);
901.4Srilligvoid fvla(int m, int C[m][m])
911.4Srillig{
921.4Srillig	typedef int VLA[m][m];
931.4Srillig	struct tag {
941.4Srillig		int (*y)[n];
951.4Srillig		int z[n];
961.4Srillig	};
971.4Srillig	int D[m];
981.4Srillig	static int E[m];
991.4Srillig	/* expect+1: warning: nested 'extern' declaration of 'F' [352] */
1001.4Srillig	extern int F[m];
1011.4Srillig	int (*s)[m];
1021.4Srillig	/* expect+1: warning: nested 'extern' declaration of 'r' [352] */
1031.4Srillig	extern int (*r)[m];
1041.4Srillig	/* expect+2: warning: illegal combination of 'pointer to array[1] of int' and 'pointer to int', op 'init' [124] */
1051.4Srillig	/* expect+1: warning: 'q' set but not used in function 'fvla' [191] */
1061.4Srillig	static int (*q)[m] = &B;
1071.4Srillig}
1081.4Srillig
1091.4Srillig// C11 6.7.6.3p15
1101.4Srilligint f(void), *fip(), (*pfi)();
1111.4Srillig
1121.4Srillig// C11 6.7.6.3p17
1131.4Srilligint (*apfi[3])(int *x, int *y);
1141.4Srillig
1151.4Srillig// C11 6.7.6.3p18
1161.4Srilligint (*fpfi(int (*)(long), int))(int, ...);
1171.4Srillig
1181.4Srillig// C11 6.7.6.3p19
1191.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x);
1201.4Srilligint main(void)
1211.4Srillig{
1221.4Srillig	double b[4][308];
1231.4Srillig	/* expect+1: warning: converting 'pointer to array[308] of double' to incompatible 'pointer to array[1] of double' for argument 3 [153] */
1241.4Srillig	addscalar(4, 2, b, 2.17);
1251.4Srillig	return 0;
1261.4Srillig}
1271.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x)
1281.4Srillig{
1291.4Srillig	for (int i = 0; i < n; i++)
1301.4Srillig		for (int j = 0, k = n*m+300; j < k; j++)
1311.4Srillig			a[i][j] += x;
1321.4Srillig}
1331.4Srillig
1341.4Srillig// C11 6.7.6.3p20
1351.4Srilligdouble maximum(int n, int m, double a[n][m]);
1361.4Srillig/* expect+1: error: null dimension [17] */
1371.4Srilligdouble maximum(int n, int m, double a[*][*]);
1381.4Srillig/* expect+1: error: null dimension [17] */
1391.4Srilligdouble maximum(int n, int m, double a[ ][*]);
1401.4Srilligdouble maximum(int n, int m, double a[ ][m]);
1411.4Srillig
1421.4Srilligvoid f1(double (* restrict a)[5]);
1431.4Srilligvoid f2(double a[restrict][5]);
1441.4Srillig/* expect+1: error: syntax error '3' [249] */
1451.4Srilligvoid f3(double a[restrict 3][5]);
1461.4Srilligvoid f4(double a[restrict static 3][5]);
1471.4Srillig
1481.4Srillig
1491.3Srillig// In C11 mode, 'thread_local' is not yet known, but '_Thread_local' is.
1501.3Srillig/* expect+2: error: old-style declaration; add 'int' [1] */
1511.3Srillig/* expect+1: error: syntax error 'int' [249] */
1521.3Srilligthread_local int thread_local_variable_c23;
1531.3Srillig_Thread_local int thread_local_variable_c11;
1541.3Srillig
1551.2Srillig/* The '_Noreturn' must not appear after the declarator. */
1561.2Srilligvoid _Noreturn exit(int) _Noreturn;
1571.2Srillig/* expect-1: error: formal parameter #1 lacks name [59] */
1581.2Srillig/* expect-2: warning: empty declaration [2] */
1591.2Srillig/* expect+2: error: syntax error '' [249] */
1601.2Srillig/* expect+1: error: cannot recover from previous errors [224] */
161