Module Name:    src
Committed By:   rillig
Date:           Sat Dec 18 13:23:09 UTC 2021

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

Log Message:
lint: document wrong data structures for modelling initializations

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.219 -r1.220 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/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.219 src/usr.bin/xlint/lint1/init.c:1.220
--- src/usr.bin/xlint/lint1/init.c:1.219	Sat Dec 18 13:06:33 2021
+++ src/usr.bin/xlint/lint1/init.c	Sat Dec 18 13:23:09 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.219 2021/12/18 13:06:33 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.220 2021/12/18 13:23:09 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.219 2021/12/18 13:06:33 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.220 2021/12/18 13:23:09 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -60,11 +60,10 @@ __RCSID("$NetBSD: init.c,v 1.219 2021/12
  *	struct { int x, y; } point = { 3, 4 };
  *	struct { int x, y; } point = { .y = 4, .x = 3 };
  *
- * Any scalar expression in the initializer may be surrounded by arbitrarily
- * many extra pairs of braces, like in the example 'number_with_braces' (C99
- * 6.7.8p11).
+ * Any scalar expression or string in the initializer may be surrounded by
+ * additional pairs of braces.
  *
- * For multi-dimensional arrays, the inner braces may be omitted like in
+ * For nested aggregate objects, the inner braces may be omitted like in
  * array_flat or spelled out like in array_nested.  This is unusual in
  * practice and therefore only supported very basically.
  *
@@ -84,6 +83,7 @@ __RCSID("$NetBSD: init.c,v 1.219 2021/12
  *
  * See also:
  *	C99 6.7.8 "Initialization"
+ *	C11 6.7.9 "Initialization"
  *	d_c99_init.c for more examples
  */
 
@@ -100,44 +100,66 @@ struct designator {
 };
 
 /*
- * The optional designation for an initializer, saying which sub-object to
- * initialize.  Examples for designations are '.member' or
- * '.member[123].member.member[1][1]'.
+ * The path from the "current object" of a brace level to the sub-object that
+ * will be initialized by the next expression.  Examples for designations are
+ * '.member' or '.member[123].member.member[1][1]'.
  *
  * C99 6.7.8p6, 6.7.8p7
  */
 struct designation {
 	struct designator *dn_items;
-	size_t dn_len;
-	size_t dn_cap;
+	size_t		dn_len;
+	size_t		dn_cap;
 };
 
 /*
- * Describes a single brace level of an ongoing initialization.
+ * Everything that happens between a '{' and the corresponding '}' of an
+ * initialization.
  *
- * See C99 6.7.8p17.
+ * C99 6.7.8p17
  */
 struct brace_level {
-	/*
-	 * The type of the current object that is initialized at this brace
-	 * level.
-	 */
+	/* The type of the "current object". */
 	const type_t	*bl_type;
 
-	struct designation bl_designation;	/* .member[123].member */
+	/*
+	 * The path to the sub-object of the "current object" that is
+	 * initialized by the next expression.
+	 *
+	 * TODO: use this not only for explicit designations but also for
+	 *  implicit designations, like in C90.
+	 */
+	struct designation bl_designation;
 
 	/*
 	 * The next member of the struct or union that is to be initialized,
 	 * unless a specific member is selected by a designator.
+	 *
+	 * TODO: use bl_designation instead.
 	 */
 	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.
+	 *
+	 * TODO: use bl_designation instead.
 	 */
 	size_t		bl_subscript;
-	bool		bl_scalar_done: 1;	/* for scalars */
-	bool		bl_confused: 1;		/* skip further checks */
+
+	/*
+	 * Whether the designation is used up, that is, there is no next
+	 * sub-object left to be initialized.
+	 */
+	bool		bl_scalar_done:1;	/* for scalars */
+
+	/*
+	 * Whether lint has been confused by allowed but extra or omitted
+	 * braces.  In such a case, lint skips further type checks on the
+	 * initializer expressions.
+	 *
+	 * TODO: properly handle the omitted braces.
+	 */
+	bool		bl_confused:1;
 
 	struct brace_level *bl_enclosing;
 };

Reply via email to