Module Name:    src
Committed By:   rillig
Date:           Fri Dec 17 15:52:30 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: d_c99_init.c d_c99_init.exp

Log Message:
tests/lint: add more examples for initialization, from C99


To generate a diff of this commit:
cvs rdiff -u -r1.33 -r1.34 src/tests/usr.bin/xlint/lint1/d_c99_init.c
cvs rdiff -u -r1.26 -r1.27 src/tests/usr.bin/xlint/lint1/d_c99_init.exp

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/tests/usr.bin/xlint/lint1/d_c99_init.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.33 src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.34
--- src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.33	Fri Apr  9 23:03:26 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_init.c	Fri Dec 17 15:52:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_c99_init.c,v 1.33 2021/04/09 23:03:26 rillig Exp $	*/
+/*	$NetBSD: d_c99_init.c,v 1.34 2021/12/17 15:52:30 rillig Exp $	*/
 # 3 "d_c99_init.c"
 
 /*
@@ -15,8 +15,9 @@ typedef struct any {
 } any;
 
 
-// C99 6.7.8p11 says "optionally enclosed in braces".  There is no limitation
-// on the number of brace pairs.
+// C99 6.7.8p11 says "optionally enclosed in braces".  Whether this wording
+// means "a single pair of braces" or "as many pairs of braces as you want"
+// is left for interpretation to the reader.
 int scalar_without_braces = 3;
 int scalar_with_optional_braces = { 3 };
 int scalar_with_too_many_braces = {{ 3 }};
@@ -262,12 +263,27 @@ struct ten ten = {
 	6,
 };
 
-int c99_6_7_8_p26_example3[4][3] = {
+
+/*
+ * ISO C99 6.7.8 provides a large list of examples for initialization,
+ * covering all tricky edge cases.
+ */
+
+int c99_6_7_8_p24_example1_i = 3.5;
+double _Complex c99_6_7_8_p24_example1_c = 5 + 3 * 1.0fi;
+
+int c99_6_7_8_p25_example2[] = { 1, 3, 5 };
+
+int c99_6_7_8_p26_example3a[4][3] = {
 	{ 1, 3, 5 },
 	{ 2, 4, 6 },
 	{ 3, 5, 7 },
 };
 
+int c99_6_7_8_p26_example3b[4][3] = {
+	1, 3, 5, 2, 4, 6, 3, 5, 7
+};
+
 int c99_6_7_8_p27_example4[4][3] = {
 	{ 1 }, { 2 }, { 3 }, { 4 }
 };
@@ -275,8 +291,8 @@ int c99_6_7_8_p27_example4[4][3] = {
 struct {
 	int a[3], b;
 } c99_6_7_8_p28_example5[] = {
-	{ 1 },		/* just parsed, not checked in detail */
-	2,		/* just parsed, not checked in detail */
+	{ 1 },
+	2,
 };
 
 short c99_6_7_8_p29_example6a[4][3][2] = {
@@ -304,10 +320,59 @@ short c99_6_7_8_p29_example6c[4][3][2] =
 	}
 };
 
+void
+c99_6_7_8_p31_example7(void)
+{
+	typedef int A[];
+
+	A a = { 1, 2 }, b = { 3, 4, 5 };
+
+	/* expect+1: error: negative array dimension (-8) [20] */
+	typedef int reveal_sizeof_a[-(int)(sizeof(a))];
+	/* expect+1: error: negative array dimension (-12) [20] */
+	typedef int reveal_sizeof_b[-(int)(sizeof(b))];
+}
+
+char c99_6_7_8_p32_example8_s1[] = "abc",
+     c99_6_7_8_p32_example8_t1[3] = "abc";
+char c99_6_7_8_p32_example8_s2[] = { 'a', 'b', 'c', '\0' },
+     c99_6_7_8_p32_example8_t2[3] = { 'a', 'b', 'c' };
+char *c99_6_7_8_p32_example8_p = "abc";
+
+enum { member_one, member_two };
+const char *c99_6_7_8_p33_example9[] = {
+	[member_two] = "member two",
+	[member_one] = "member one",
+};
+
+struct {
+	int quot, rem;
+} c99_6_7_8_p34_example10 = { .quot = 2, .rem = -1 };
+
+struct { int a[3], b; } c99_6_7_8_p35_example11[] =
+	{ [0].a = {1}, [1].a[0] = 2 };
+
+int c99_6_7_8_p36_example12a[16] = {
+	1, 3, 5, 7, 9, [16-5] = 8, 6, 4, 2, 0
+};
+
+int c99_6_7_8_p36_example12b[8] = {
+	1, 3, 5, 7, 9, [8-5] = 8, 6, 4, 2, 0
+};
+
+union {
+	int first_member;
+	void *second_member;
+	unsigned char any_member;
+} c99_6_7_8_p38_example13 = { .any_member = 42 };
+
+
 /*
  * During initialization of an object of type array of unknown size, the type
  * information on the symbol is updated in-place.  Ensure that this happens on
  * a copy of the type.
+ *
+ * C99 6.7.8p31 example 7
  */
 void
 ensure_array_type_is_not_modified_during_initialization(void)
@@ -324,6 +389,9 @@ ensure_array_type_is_not_modified_during
 	case 12:
 		break;
 	}
+
+	/* expect+1: error: negative array dimension (-12) [20] */
+	typedef int reveal_sizeof_a1[-(int)(sizeof(a1))];
 }
 
 struct point unknown_member_name_beginning = {

Index: src/tests/usr.bin/xlint/lint1/d_c99_init.exp
diff -u src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.26 src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.27
--- src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.26	Fri Apr  9 23:03:26 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_init.exp	Fri Dec 17 15:52:30 2021
@@ -1,25 +1,28 @@
-d_c99_init.c(23): error: too many initializers [174]
-d_c99_init.c(63): error: cannot initialize 'pointer to const void' from 'struct any' [185]
-d_c99_init.c(80): error: too many array initializers, expected 3 [173]
-d_c99_init.c(138): error: too many struct/union initializers [172]
-d_c99_init.c(144): error: syntax error 'designator '.member' is only for struct/union' [249]
-d_c99_init.c(217): error: array subscript cannot be > 2: 3 [168]
-d_c99_init.c(219): error: array subscript cannot be > 4: 5 [168]
-d_c99_init.c(221): error: array subscript cannot be > 1: 2 [168]
-d_c99_init.c(230): error: too many struct/union initializers [172]
-d_c99_init.c(236): warning: illegal combination of integer (char) and pointer (pointer to char) [183]
-d_c99_init.c(321): error: duplicate case in switch: 0 [199]
-d_c99_init.c(330): error: type 'struct point' does not have member 'r' [101]
-d_c99_init.c(337): error: type 'struct point' does not have member 'r' [101]
-d_c99_init.c(344): error: type 'struct point' does not have member 'r' [101]
-d_c99_init.c(353): error: type 'union value' does not have member 'unknown_value' [101]
-d_c99_init.c(359): error: type 'union value' does not have member 'unknown_value' [101]
-d_c99_init.c(363): error: syntax error 'designator '[...]' is only for arrays' [249]
-d_c99_init.c(364): error: type 'struct point' does not have member 'member' [101]
-d_c99_init.c(370): warning: structure has no named members [65]
-d_c99_init.c(371): error: too many struct/union initializers [172]
-d_c99_init.c(376): warning: union has no named members [65]
-d_c99_init.c(377): error: too many struct/union initializers [172]
-d_c99_init.c(381): error: syntax error 'scalar type cannot use designator' [249]
-d_c99_init.c(385): error: syntax error 'scalar type cannot use designator' [249]
-d_c99_init.c(386): error: syntax error 'scalar type cannot use designator' [249]
+d_c99_init.c(24): error: too many initializers [174]
+d_c99_init.c(64): error: cannot initialize 'pointer to const void' from 'struct any' [185]
+d_c99_init.c(81): error: too many array initializers, expected 3 [173]
+d_c99_init.c(139): error: too many struct/union initializers [172]
+d_c99_init.c(145): error: syntax error 'designator '.member' is only for struct/union' [249]
+d_c99_init.c(218): error: array subscript cannot be > 2: 3 [168]
+d_c99_init.c(220): error: array subscript cannot be > 4: 5 [168]
+d_c99_init.c(222): error: array subscript cannot be > 1: 2 [168]
+d_c99_init.c(231): error: too many struct/union initializers [172]
+d_c99_init.c(237): warning: illegal combination of integer (char) and pointer (pointer to char) [183]
+d_c99_init.c(331): error: negative array dimension (-8) [20]
+d_c99_init.c(333): error: negative array dimension (-12) [20]
+d_c99_init.c(386): error: duplicate case in switch: 0 [199]
+d_c99_init.c(394): error: negative array dimension (-12) [20]
+d_c99_init.c(398): error: type 'struct point' does not have member 'r' [101]
+d_c99_init.c(405): error: type 'struct point' does not have member 'r' [101]
+d_c99_init.c(412): error: type 'struct point' does not have member 'r' [101]
+d_c99_init.c(421): error: type 'union value' does not have member 'unknown_value' [101]
+d_c99_init.c(427): error: type 'union value' does not have member 'unknown_value' [101]
+d_c99_init.c(431): error: syntax error 'designator '[...]' is only for arrays' [249]
+d_c99_init.c(432): error: type 'struct point' does not have member 'member' [101]
+d_c99_init.c(438): warning: structure has no named members [65]
+d_c99_init.c(439): error: too many struct/union initializers [172]
+d_c99_init.c(444): warning: union has no named members [65]
+d_c99_init.c(445): error: too many struct/union initializers [172]
+d_c99_init.c(449): error: syntax error 'scalar type cannot use designator' [249]
+d_c99_init.c(453): error: syntax error 'scalar type cannot use designator' [249]
+d_c99_init.c(454): error: syntax error 'scalar type cannot use designator' [249]

Reply via email to