Module Name:    src
Committed By:   rillig
Date:           Fri Dec 17 09:12:46 UTC 2021

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

Log Message:
lint: work around lint bug in initialization with few braces

Needs a proper fix later, but for now, this workaround allows to run
lint on Postfix again.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/xlint/lint1/init.c \
    src/tests/usr.bin/xlint/lint1/init.exp
cvs rdiff -u -r1.212 -r1.213 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/init.c
diff -u src/tests/usr.bin/xlint/lint1/init.c:1.2 src/tests/usr.bin/xlint/lint1/init.c:1.3
--- src/tests/usr.bin/xlint/lint1/init.c:1.2	Fri Dec 17 01:00:50 2021
+++ src/tests/usr.bin/xlint/lint1/init.c	Fri Dec 17 09:12:46 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.2 2021/12/17 01:00:50 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.3 2021/12/17 09:12:46 rillig Exp $	*/
 # 3 "init.c"
 
 /*
@@ -34,9 +34,11 @@ typedef struct {
  * human readers, it is usually clearer to include them.
  *
  * Seen in external/ibm-public/postfix/dist/src/util/dict.c(624).
+ *
+ * TODO: Properly handle this situation; as of init.c 1.212 from 2021-12-17,
+ *  the below initialization sets in->in_err but shouldn't.
  */
 const histogram_entry hgr[] = {
-	/* expect+1: error: cannot initialize 'struct typedef histogram_entry' from 'pointer to char' [185] */
 	"odd", 5,
 	"even", 5,
 };
Index: src/tests/usr.bin/xlint/lint1/init.exp
diff -u src/tests/usr.bin/xlint/lint1/init.exp:1.2 src/tests/usr.bin/xlint/lint1/init.exp:1.3
--- src/tests/usr.bin/xlint/lint1/init.exp:1.2	Fri Dec 17 01:00:50 2021
+++ src/tests/usr.bin/xlint/lint1/init.exp	Fri Dec 17 09:12:46 2021
@@ -1,2 +1 @@
 init.c(16): error: empty array declaration: empty_array_with_initializer [190]
-init.c(40): error: cannot initialize 'struct typedef histogram_entry' from 'pointer to char' [185]

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.212 src/usr.bin/xlint/lint1/init.c:1.213
--- src/usr.bin/xlint/lint1/init.c:1.212	Fri Dec 17 01:24:00 2021
+++ src/usr.bin/xlint/lint1/init.c	Fri Dec 17 09:12:45 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.212 2021/12/17 01:24:00 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.213 2021/12/17 09:12:45 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.212 2021/12/17 01:24:00 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.213 2021/12/17 09:12:45 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -766,11 +766,17 @@ done:
 static void
 initialization_set_size_of_unknown_array(struct initialization *in)
 {
+	size_t dim;
 
-	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_max_subscript);
+	if (!(in->in_sym->s_type->t_incomplete_array &&
+	      in->in_brace_level->bl_enclosing == NULL))
+		return;
+
+	dim = in->in_brace_level->bl_max_subscript;
+	if (dim == 0 && in->in_err)
+		dim = 1;	/* prevent "empty array declaration: %s" */
+
+	update_type_of_array_of_unknown_size(in->in_sym, dim);
 }
 
 static void
@@ -778,12 +784,11 @@ initialization_end_brace_level(struct in
 {
 	struct brace_level *bl;
 
-	if (in->in_err)
-		return;
-
 	debug_enter();
 
 	initialization_set_size_of_unknown_array(in);
+	if (in->in_err)
+		goto done;
 
 	bl = in->in_brace_level;
 	in->in_brace_level = bl->bl_enclosing;
@@ -795,6 +800,7 @@ initialization_end_brace_level(struct in
 	if (bl != NULL)
 		designation_reset(&bl->bl_designation);
 
+done:
 	initialization_debug(in);
 	debug_leave();
 }
@@ -853,8 +859,15 @@ initialization_init_array_using_string(s
 	tp = initialization_sub_type(in, true);
 	strg = tn->tn_string;
 
-	if (!is_character_array(tp, strg->st_tspec))
+	if (!is_character_array(tp, strg->st_tspec)) {
+		/* TODO: recursively try first member or [0] */
+		if (is_struct_or_union(tp->t_tspec) ||
+		    (tp->t_tspec == ARRAY &&
+		     is_struct_or_union(tp->t_subt->t_tspec)))
+			in->in_err = true;
 		return false;
+	}
+
 	if (bl != NULL && tp->t_tspec != ARRAY && bl->bl_subscript != 0)
 		return false;
 
@@ -901,6 +914,8 @@ initialization_expr(struct initializatio
 		goto done;
 	if (initialization_init_array_using_string(in, tn))
 		goto advance;
+	if (in->in_err)
+		goto done;
 
 	if (bl != NULL)
 		brace_level_apply_designation(bl);

Reply via email to