Module Name: src Committed By: rillig Date: Sat Dec 18 13:06:33 UTC 2021
Modified Files: src/usr.bin/xlint/lint1: init.c Log Message: lint: move maximum seen subscript from brace level to initialization There is no need to store this information at every brace level since in any translation unit that survives a conforming C99 compiler, an array of unknown size is only possible once per initialization, not once per brace level. To generate a diff of this commit: cvs rdiff -u -r1.218 -r1.219 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.218 src/usr.bin/xlint/lint1/init.c:1.219 --- src/usr.bin/xlint/lint1/init.c:1.218 Sat Dec 18 11:25:15 2021 +++ src/usr.bin/xlint/lint1/init.c Sat Dec 18 13:06:33 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.218 2021/12/18 11:25:15 rillig Exp $ */ +/* $NetBSD: init.c,v 1.219 2021/12/18 13:06:33 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.218 2021/12/18 11:25:15 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.219 2021/12/18 13:06:33 rillig Exp $"); #endif #include <stdlib.h> @@ -136,11 +136,6 @@ struct brace_level { * 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 */ @@ -161,6 +156,12 @@ struct initialization { struct brace_level *in_brace_level; /* + * The maximum subscript that has ever be seen for an array of + * unknown size, which can only occur at the outermost brace level. + */ + size_t in_max_subscript; + + /* * Is set when a structural error occurred in the initialization. * The effect is that the rest of the initialization is ignored * (parsed by yacc, expression trees built, but no initialization @@ -595,7 +596,7 @@ brace_level_apply_designation(struct bra * C99 6.7.8p17 */ static void -brace_level_advance(struct brace_level *bl) +brace_level_advance(struct brace_level *bl, size_t *max_subscript) { switch (bl->bl_type->t_tspec) { @@ -608,8 +609,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; + if (bl->bl_subscript > *max_subscript) + *max_subscript = bl->bl_subscript; break; default: bl->bl_scalar_done = true; @@ -735,7 +736,7 @@ initialization_set_size_of_unknown_array in->in_brace_level->bl_enclosing == NULL)) return; - dim = in->in_brace_level->bl_max_subscript; + dim = in->in_max_subscript; if (dim == 0 && (in->in_err || in->in_brace_level->bl_confused)) dim = 1; /* prevent "empty array declaration: %s" */ @@ -759,7 +760,7 @@ initialization_end_brace_level(struct in bl = in->in_brace_level; if (bl != NULL) - brace_level_advance(bl); + brace_level_advance(bl, &in->in_max_subscript); if (bl != NULL) designation_reset(&bl->bl_designation); @@ -913,7 +914,7 @@ initialization_expr(struct initializatio advance: if (bl != NULL) - brace_level_advance(bl); + brace_level_advance(bl, &in->in_max_subscript); done: if (bl != NULL) designation_reset(&bl->bl_designation);