Module Name:    src
Committed By:   rillig
Date:           Fri Jan  1 19:11:20 UTC 2021

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

Log Message:
lint: fix wrong warning about bitfield in C99 structure initialization

The variable namemem is supposed to be a circular list, which is
"documented" implicitly in push_member.

The implementation was buggy though.  In pop_member, the circular list
was destroyed though.  Given the list (capital, major, favorite_color,
green), removing capital made major point to itself in the forward
direction, even though it should not have been modified at all.

In the test, I had been too optimistic to quickly understand the code
around variable initialization.  I was wrong though, so I had to adjust
the comments there to reality.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/d_init_pop_member.c \
    src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp
cvs rdiff -u -r1.51 -r1.52 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/d_init_pop_member.c
diff -u src/tests/usr.bin/xlint/lint1/d_init_pop_member.c:1.1 src/tests/usr.bin/xlint/lint1/d_init_pop_member.c:1.2
--- src/tests/usr.bin/xlint/lint1/d_init_pop_member.c:1.1	Fri Jan  1 16:50:47 2021
+++ src/tests/usr.bin/xlint/lint1/d_init_pop_member.c	Fri Jan  1 19:11:20 2021
@@ -1,7 +1,7 @@
 # 2
 
 /*
- * Between init.c 1.27 from 2015-07-28 and init.c 1.52 from 2021-01-01,
+ * Since init.c 1.27 from 2015-07-28,
  * a bug in memberpop or pop_member led to a wrong error message
  * "undefined struct/union member: capital [101]" in the second and third
  * named initializer.
@@ -37,20 +37,20 @@ void func(void)
 	struct state st = {
 	    .capital.major.hobbies.dancing = 1,
 	    /*
-	     * Between 2015-07-28 and 2021-01-01:
+	     * Since 2015-07-28:
 	     * wrong "undefined struct/union member: capital [101]"
 	     */
 	    /*
-	     * As of 2020-01-01:
+	     * Before init.c 1.52 from 2020-01-01:
 	     * wrong "warning: bit-field initializer does not fit [180]"
 	     */
 	    .capital.major.favorite_color.green = 0xFF,
 	    /*
-	     * Between 2015-07-28 and 2021-01-01:
+	     * Since 2015-07-28:
 	     * wrong "undefined struct/union member: capital [101]"
 	     */
 	    /*
-	     * As of 2020-01-01:
+	     * Before init.c 1.52 from 2020-01-01:
 	     * wrong "warning: bit-field initializer does not fit [180]"
 	     */
 	    .capital.major.favorite_color.red = 0xFF
Index: src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp
diff -u src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp:1.1 src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp:1.2
--- src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp:1.1	Fri Jan  1 16:50:47 2021
+++ src/tests/usr.bin/xlint/lint1/d_init_pop_member.exp	Fri Jan  1 19:11:20 2021
@@ -1,4 +1,2 @@
 (47): undefined struct/union member: capital [101]
-(47): warning: bit-field initializer does not fit [180]
 (57): undefined struct/union member: capital [101]
-(57): warning: bit-field initializer does not fit [180]

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.51 src/usr.bin/xlint/lint1/init.c:1.52
--- src/usr.bin/xlint/lint1/init.c:1.51	Fri Jan  1 16:50:47 2021
+++ src/usr.bin/xlint/lint1/init.c	Fri Jan  1 19:11:19 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.51 2021/01/01 16:50:47 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.52 2021/01/01 19:11:19 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.51 2021/01/01 16:50:47 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.52 2021/01/01 19:11:19 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -109,8 +109,8 @@ pop_member(void)
 	} else {
 		namlist_t *nam = namedmem;
 		namedmem = namedmem->n_next;
-		namedmem->n_next = nam->n_next; /* FIXME: inner circle */
-		namedmem->n_prev = nam->n_prev;
+		nam->n_prev->n_next = nam->n_next;
+		nam->n_next->n_prev = nam->n_prev;
 		free(nam);
 	}
 }

Reply via email to