Module Name: src Committed By: rillig Date: Fri Jul 2 22:46:43 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: c99_init_array.c c99_init_array.exp src/usr.bin/xlint/lint1: init.c Log Message: lint: fix initialization of array of unknown size The size of the resulting array was computed wrong. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/c99_init_array.c \ src/tests/usr.bin/xlint/lint1/c99_init_array.exp cvs rdiff -u -r1.200 -r1.201 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/c99_init_array.c diff -u src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.1 src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.2 --- src/tests/usr.bin/xlint/lint1/c99_init_array.c:1.1 Fri Jul 2 21:52:36 2021 +++ src/tests/usr.bin/xlint/lint1/c99_init_array.c Fri Jul 2 22:46:43 2021 @@ -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 }; Index: src/tests/usr.bin/xlint/lint1/c99_init_array.exp diff -u src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.1 src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.2 --- src/tests/usr.bin/xlint/lint1/c99_init_array.exp:1.1 Fri Jul 2 21:52:36 2021 +++ src/tests/usr.bin/xlint/lint1/c99_init_array.exp Fri Jul 2 22:46:43 2021 @@ -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] Index: src/usr.bin/xlint/lint1/init.c diff -u src/usr.bin/xlint/lint1/init.c:1.200 src/usr.bin/xlint/lint1/init.c:1.201 --- src/usr.bin/xlint/lint1/init.c:1.200 Tue Jun 29 21:05:32 2021 +++ src/usr.bin/xlint/lint1/init.c Fri Jul 2 22:46:43 2021 @@ -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