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