Module Name: src Committed By: rillig Date: Mon Mar 29 21:09:21 UTC 2021
Modified Files: src/usr.bin/xlint/lint1: init.c Log Message: lint: add helper functions No functional change. To generate a diff of this commit: cvs rdiff -u -r1.176 -r1.177 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.176 src/usr.bin/xlint/lint1/init.c:1.177 --- src/usr.bin/xlint/lint1/init.c:1.176 Mon Mar 29 20:52:00 2021 +++ src/usr.bin/xlint/lint1/init.c Mon Mar 29 21:09:21 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.176 2021/03/29 20:52:00 rillig Exp $ */ +/* $NetBSD: init.c,v 1.177 2021/03/29 21:09:21 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.176 2021/03/29 20:52:00 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.177 2021/03/29 21:09:21 rillig Exp $"); #endif #include <stdlib.h> @@ -341,6 +341,46 @@ is_struct_or_union(tspec_t t) return t == STRUCT || t == UNION; } +static bool +has_automatic_storage_duration(const sym_t *sym) +{ + + return sym->s_scl == AUTO || sym->s_scl == REG; +} + +/* C99 6.7.8p14, 6.7.8p15 */ +static bool +is_string_array(const type_t *tp, tspec_t t) +{ + tspec_t st; + + if (tp == NULL || tp->t_tspec != ARRAY) + return false; + + st = tp->t_subt->t_tspec; + return t == CHAR + ? st == CHAR || st == UCHAR || st == SCHAR + : st == WCHAR; +} + +/* C99 6.7.8p9 */ +static bool +is_unnamed_member(const sym_t *m) +{ + + return m->s_bitfield && m->s_name == unnamed; +} + +static const sym_t * +look_up_member(const sym_t *m, const char *name) +{ + + for (; m != NULL; m = m->s_next) + if (!is_unnamed_member(m) && strcmp(m->s_name, name) == 0) + return m; + return NULL; +} + /* In traditional C, bit-fields can be initialized only by integer constants. */ static void @@ -357,18 +397,18 @@ check_bit_field_init(const tnode_t *ln, } static void -check_non_constant_initializer(const tnode_t *tn, scl_t sclass) +check_non_constant_initializer(const tnode_t *tn, const sym_t *sym) { - const sym_t *sym; - ptrdiff_t offs; + const sym_t *unused_sym; + ptrdiff_t unused_offs; if (tn == NULL || tn->tn_op == CON) return; - if (constant_addr(tn, &sym, &offs)) + if (constant_addr(tn, &unused_sym, &unused_offs)) return; - if (sclass == AUTO || sclass == REG) { + if (has_automatic_storage_duration(sym)) { /* non-constant initializer */ c99ism(177); } else { @@ -378,7 +418,7 @@ check_non_constant_initializer(const tno } static void -check_init_expr(scl_t sclass, const type_t *tp, sym_t *sym, tnode_t *tn) +check_init_expr(const type_t *tp, sym_t *sym, tnode_t *tn) { tnode_t *ln; tspec_t lt, rt; @@ -418,7 +458,7 @@ check_init_expr(scl_t sclass, const type if (lt != rt || (tp->t_bitfield && tn->tn_op == CON)) tn = convert(INIT, 0, unconst_cast(tp), tn); - check_non_constant_initializer(tn, sclass); + check_non_constant_initializer(tn, sym); } @@ -605,22 +645,11 @@ brace_level_next_member(struct brace_lev static const sym_t * brace_level_look_up_member(const struct brace_level *level, const char *name) { - const type_t *tp = level->bl_type; - const sym_t *m; brace_level_assert_struct_or_union(level); - - for (m = tp->t_str->sou_first_member; m != NULL; m = m->s_next) { - if (m->s_bitfield && m->s_name == unnamed) - continue; - if (strcmp(m->s_name, name) == 0) - return m; - } - - return NULL; + return look_up_member(level->bl_type->t_str->sou_first_member, name); } -/* TODO: merge duplicate code */ static sym_t * brace_level_look_up_first_member_named(struct brace_level *level, const char *name, int *count) @@ -629,7 +658,7 @@ brace_level_look_up_first_member_named(s for (m = level->bl_type->t_str->sou_first_member; m != NULL; m = m->s_next) { - if (m->s_bitfield && m->s_name == unnamed) + if (is_unnamed_member(m)) continue; if (strcmp(m->s_name, name) != 0) continue; @@ -640,7 +669,6 @@ brace_level_look_up_first_member_named(s return m; } -/* TODO: merge duplicate code */ static sym_t * brace_level_look_up_first_member_unnamed(struct brace_level *level, int *count) { @@ -650,7 +678,7 @@ brace_level_look_up_first_member_unnamed for (m = level->bl_type->t_str->sou_first_member; m != NULL; m = m->s_next) { - if (m->s_bitfield && m->s_name == unnamed) + if (is_unnamed_member(m)) continue; /* XXX: What is this code for? */ if (++(*count) == 1) { @@ -1197,19 +1225,6 @@ initialization_add_designator_subscript( debug_leave(); } -static bool -is_string_array(const type_t *tp, tspec_t t) -{ - tspec_t st; - - if (tp == NULL || tp->t_tspec != ARRAY) - return false; - st = tp->t_subt->t_tspec; - return t == CHAR - ? st == CHAR || st == UCHAR || st == SCHAR - : st == WCHAR; -} - /* Initialize a character array or wchar_t array with a string literal. */ static bool initialization_init_array_using_string(struct initialization *in, tnode_t *tn) @@ -1350,7 +1365,6 @@ initialization_next_nobrace(struct initi static void initialization_expr(struct initialization *in, tnode_t *tn) { - scl_t sclass; debug_enter(); initialization_debug(in); @@ -1361,8 +1375,7 @@ initialization_expr(struct initializatio if (in->in_err || tn == NULL) goto done; - sclass = in->in_sym->s_scl; - if ((sclass == AUTO || sclass == REG) && + if (has_automatic_storage_duration(in->in_sym) && initialization_init_using_assign(in, tn)) goto done; @@ -1378,7 +1391,7 @@ initialization_expr(struct initializatio goto done_debug; /* Using initsym here is better than nothing. */ - check_init_expr(sclass, in->in_brace_level->bl_type, in->in_sym, tn); + check_init_expr(in->in_brace_level->bl_type, in->in_sym, tn); in->in_brace_level->bl_remaining--; debug_step("%d elements remaining", in->in_brace_level->bl_remaining);