Module Name:    src
Committed By:   rillig
Date:           Thu Mar 25 22:15:38 UTC 2021

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

Log Message:
lint: improve initialization of arrays with designators

Initialization is still buggy but better than before.  The remaining bug
is that only the first designator determines the array size, and after
that, the array is no longer considered of unknown size.  This
contradicts C99.  More improvements to come.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_168.c \
    src/tests/usr.bin/xlint/lint1/msg_168.exp
cvs rdiff -u -r1.131 -r1.132 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/msg_168.c
diff -u src/tests/usr.bin/xlint/lint1/msg_168.c:1.3 src/tests/usr.bin/xlint/lint1/msg_168.c:1.4
--- src/tests/usr.bin/xlint/lint1/msg_168.c:1.3	Sun Mar  7 16:40:20 2021
+++ src/tests/usr.bin/xlint/lint1/msg_168.c	Thu Mar 25 22:15:38 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_168.c,v 1.3 2021/03/07 16:40:20 rillig Exp $	*/
+/*	$NetBSD: msg_168.c,v 1.4 2021/03/25 22:15:38 rillig Exp $	*/
 # 3 "msg_168.c"
 
 // Test for message: array subscript cannot be > %d: %ld [168]
@@ -9,7 +9,7 @@ void print_char(char);
 void
 example(void)
 {
-	char buf[20] = {};
+	char buf[20] = {};	/* empty initializer is a GCC extension */
 
 	print_string(buf + 19);	/* inside the array */
 
Index: src/tests/usr.bin/xlint/lint1/msg_168.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_168.exp:1.3 src/tests/usr.bin/xlint/lint1/msg_168.exp:1.4
--- src/tests/usr.bin/xlint/lint1/msg_168.exp:1.3	Sun Mar  7 16:40:20 2021
+++ src/tests/usr.bin/xlint/lint1/msg_168.exp	Thu Mar 25 22:15:38 2021
@@ -1,3 +1,3 @@
 msg_168.c(28): warning: array subscript cannot be > 19: 20 [168]
-msg_168.c(40): warning: array subscript cannot be > 2: 57 [168]
-msg_168.c(41): warning: array subscript cannot be > 2: 58 [168]
+msg_168.c(40): warning: array subscript cannot be > 51: 57 [168]
+msg_168.c(41): warning: array subscript cannot be > 51: 58 [168]

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.131 src/usr.bin/xlint/lint1/init.c:1.132
--- src/usr.bin/xlint/lint1/init.c:1.131	Thu Mar 25 21:51:55 2021
+++ src/usr.bin/xlint/lint1/init.c	Thu Mar 25 22:15:38 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.131 2021/03/25 21:51:55 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.132 2021/03/25 22:15:38 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.131 2021/03/25 21:51:55 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.132 2021/03/25 22:15:38 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -517,9 +517,21 @@ designation_add_name(sbuf_t *sb)
 void
 designation_add_subscript(range_t range)
 {
+	initstack_element *istk;
+
 	debug_enter();
 	debug_step("subscript range is %zu ... %zu", range.lo, range.hi);
 	debug_initstack();
+
+	istk = initstk_lvalue;
+	if (istk->i_array_of_unknown_size) {
+		int auto_dim = (int)(range.hi + 1);
+		if (auto_dim > istk->i_type->t_dim) {
+			debug_step("setting the array size to %d", auto_dim);
+			istk->i_type->t_dim = auto_dim;
+		}
+	}
+
 	debug_leave();
 }
 
@@ -1280,6 +1292,11 @@ init_array_using_string(tnode_t *tn)
 	len = strg->st_len;
 
 	if (istk->i_array_of_unknown_size) {
+		/*
+		 * FIXME: C99 6.7.8p22 explicitly says that only "at the end
+		 * of its initializer list, the array no longer has incomplete
+		 * type".
+		 */
 		istk->i_array_of_unknown_size = false;
 		istk->i_type->t_dim = len + 1;
 		setcomplete(istk->i_type, true);

Reply via email to