Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/xlint/lint1 lint: fix initialization of array of unk...



details:   https://anonhg.NetBSD.org/src/rev/01f9f7a18e08
branches:  trunk
changeset: 380041:01f9f7a18e08
user:      rillig <rillig%NetBSD.org@localhost>
date:      Fri Jul 02 22:46:43 2021 +0000

description:
lint: fix initialization of array of unknown size

The size of the resulting array was computed wrong.

diffstat:

 tests/usr.bin/xlint/lint1/c99_init_array.c   |   4 +-
 tests/usr.bin/xlint/lint1/c99_init_array.exp |   1 +
 usr.bin/xlint/lint1/init.c                   |  38 ++++++++++++++++++---------
 3 files changed, 28 insertions(+), 15 deletions(-)

diffs (100 lines):

diff -r 20b92b48143d -r 01f9f7a18e08 tests/usr.bin/xlint/lint1/c99_init_array.c
--- a/tests/usr.bin/xlint/lint1/c99_init_array.c        Fri Jul 02 21:52:36 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/c99_init_array.c        Fri Jul 02 22:46:43 2021 +0000
@@ -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 };
diff -r 20b92b48143d -r 01f9f7a18e08 tests/usr.bin/xlint/lint1/c99_init_array.exp
--- a/tests/usr.bin/xlint/lint1/c99_init_array.exp      Fri Jul 02 21:52:36 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/c99_init_array.exp      Fri Jul 02 22:46:43 2021 +0000
@@ -1,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]
diff -r 20b92b48143d -r 01f9f7a18e08 usr.bin/xlint/lint1/init.c
--- a/usr.bin/xlint/lint1/init.c        Fri Jul 02 21:52:36 2021 +0000
+++ b/usr.bin/xlint/lint1/init.c        Fri Jul 02 22:46:43 2021 +0000
@@ -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



Home | Main Index | Thread Index | Old Index