c11.c revision 1.10
11.10Srillig/*	$NetBSD: c11.c,v 1.10 2025/04/12 15:49:49 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.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.4Srilligint f(void), *fip(), (*pfi)();
1311.4Srillig
1321.4Srillig// C11 6.7.6.3p17
1331.4Srilligint (*apfi[3])(int *x, int *y);
1341.4Srillig
1351.4Srillig// C11 6.7.6.3p18
1361.4Srilligint (*fpfi(int (*)(long), int))(int, ...);
1371.4Srillig
1381.4Srillig// C11 6.7.6.3p19
1391.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x);
1401.4Srilligint main(void)
1411.4Srillig{
1421.4Srillig	double b[4][308];
1431.4Srillig	/* expect+1: warning: converting 'pointer to array[308] of double' to incompatible 'pointer to array[1] of double' for argument 3 [153] */
1441.4Srillig	addscalar(4, 2, b, 2.17);
1451.4Srillig	return 0;
1461.4Srillig}
1471.4Srilligvoid addscalar(int n, int m, double a[n][n*m+300], double x)
1481.4Srillig{
1491.4Srillig	for (int i = 0; i < n; i++)
1501.4Srillig		for (int j = 0, k = n*m+300; j < k; j++)
1511.4Srillig			a[i][j] += x;
1521.4Srillig}
1531.4Srillig
1541.4Srillig// C11 6.7.6.3p20
1551.4Srilligdouble maximum(int n, int m, double a[n][m]);
1561.4Srillig/* expect+1: error: null dimension [17] */
1571.4Srilligdouble maximum(int n, int m, double a[*][*]);
1581.4Srillig/* expect+1: error: null dimension [17] */
1591.4Srilligdouble maximum(int n, int m, double a[ ][*]);
1601.4Srilligdouble maximum(int n, int m, double a[ ][m]);
1611.4Srillig
1621.4Srilligvoid f1(double (* restrict a)[5]);
1631.4Srilligvoid f2(double a[restrict][5]);
1641.4Srillig/* expect+1: error: syntax error '3' [249] */
1651.4Srilligvoid f3(double a[restrict 3][5]);
1661.4Srilligvoid f4(double a[restrict static 3][5]);
1671.4Srillig
1681.4Srillig
1691.8Srilligint _Alignas(double) int_aligned_as_double;
1701.8Srillig
1711.8Srillig
1721.3Srillig// In C11 mode, 'thread_local' is not yet known, but '_Thread_local' is.
1731.3Srillig/* expect+2: error: old-style declaration; add 'int' [1] */
1741.3Srillig/* expect+1: error: syntax error 'int' [249] */
1751.3Srilligthread_local int thread_local_variable_c23;
1761.3Srillig_Thread_local int thread_local_variable_c11;
1771.3Srillig
1781.2Srillig/* The '_Noreturn' must not appear after the declarator. */
1791.6Srillig/* expect+2: error: formal parameter #1 lacks name [59] */
1801.6Srillig/* expect+1: warning: empty declaration [2] */
1811.2Srilligvoid _Noreturn exit(int) _Noreturn;
1821.2Srillig/* expect+2: error: syntax error '' [249] */
1831.2Srillig/* expect+1: error: cannot recover from previous errors [224] */
184