Module Name:    src
Committed By:   rillig
Date:           Fri Jul  2 22:46:43 UTC 2021

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

Log Message:
lint: fix initialization of array of unknown size

The size of the resulting array was computed wrong.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/c99_init_array.c \
    src/tests/usr.bin/xlint/lint1/c99_init_array.exp
cvs rdiff -u -r1.200 -r1.201 src/usr.bin/xlint/lint1/init.c

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/c99_init_array.c
diff -u src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.1 src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.2
--- src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.1	Fri Jul  2 21:52:36 2021
+++ src/tests/usr.bin/xlint/lint1/c99_init_array.c	Fri Jul  2 22:46:43 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: c99_init_array.c,v 1.1 2021/07/02 21:52:36 rillig Exp $	*/
+/*	$NetBSD: c99_init_array.c,v 1.2 2021/07/02 22:46:43 rillig Exp $	*/
 # 3 "c99_init_array.c"
 
 /*
@@ -11,7 +11,7 @@
 // one mentioned.
 int arr_11[] = { [10] = 10, [0] = 0 };
 typedef int ctassert_11[sizeof(arr_11) / sizeof(arr_11[0]) == 11 ? -1 : 1];
-/* TODO: expect-1: error: negative array dimension (-1) [20] */
+/* expect-1: error: negative array dimension (-1) [20] */
 
 // Without an explicit subscript designator, the subscript counts up.
 int arr_3[] = { [1] = 1, [0] = 0, 1, 2 };
Index: src/tests/usr.bin/xlint/lint1/c99_init_array.exp
diff -u src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.1 src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.2
--- src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.1	Fri Jul  2 21:52:36 2021
+++ src/tests/usr.bin/xlint/lint1/c99_init_array.exp	Fri Jul  2 22:46:43 2021
@@ -1 +1,2 @@
+c99_init_array.c(13): error: negative array dimension (-1) [20]
 c99_init_array.c(18): error: negative array dimension (-1) [20]

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.200 src/usr.bin/xlint/lint1/init.c:1.201
--- src/usr.bin/xlint/lint1/init.c:1.200	Tue Jun 29 21:05:32 2021
+++ src/usr.bin/xlint/lint1/init.c	Fri Jul  2 22:46:43 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.200 2021/06/29 21:05:32 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.201 2021/07/02 22:46:43 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.200 2021/06/29 21:05:32 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.201 2021/07/02 22:46:43 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -118,14 +118,29 @@ struct designation {
  * See C99 6.7.8p17.
  */
 struct brace_level {
-	const type_t	*bl_type;	/* The type of the current object that
-					 * is initialized at this brace
-					 * level. */
+	/*
+	 * The type of the current object that is initialized at this brace
+	 * level.
+	 */
+	const type_t	*bl_type;
 
 	struct designation bl_designation;	/* .member[123].member */
 
-	const sym_t	*bl_member;		/* for structs and unions */
-	size_t		bl_subscript;		/* for arrays */
+	/*
+	 * The next member of the struct or union that is to be initialized,
+	 * unless a specific member is selected by a designator.
+	 */
+	const sym_t	*bl_member;
+	/*
+	 * The subscript of the next array element that is to be initialized,
+	 * unless a specific subscript is selected by a designator.
+	 */
+	size_t		bl_subscript;
+	/*
+	 * The maximum subscript that has ever be seen; only relevant for an
+	 * array of unknown size at the outermost brace level.
+	 */
+	size_t		bl_max_subscript;
 	bool		bl_scalar_done: 1;	/* for scalars */
 	bool		bl_confused: 1;		/* skip further checks */
 
@@ -700,6 +715,8 @@ brace_level_advance(struct brace_level *
 		break;
 	case ARRAY:
 		bl->bl_subscript++;
+		if (bl->bl_subscript > bl->bl_max_subscript)
+			bl->bl_max_subscript = bl->bl_subscript;
 		break;
 	default:
 		bl->bl_scalar_done = true;
@@ -822,12 +839,7 @@ initialization_set_size_of_unknown_array
 	if (in->in_sym->s_type->t_incomplete_array &&
 	    in->in_brace_level->bl_enclosing == NULL)
 		update_type_of_array_of_unknown_size(in->in_sym,
-		    in->in_brace_level->bl_subscript);
-	/*
-	 * XXX: bl_subscript is not entirely correct.
-	 * It should rather be max(actually used subscript) + 1.
-	 * int arr[] = { [100] = 100, [0] = 0 };
-	 */
+		    in->in_brace_level->bl_max_subscript);
 }
 
 static void

Reply via email to