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: add helper functions
details: https://anonhg.NetBSD.org/src/rev/177260d545eb
branches: trunk
changeset: 960813:177260d545eb
user: rillig <rillig%NetBSD.org@localhost>
date: Mon Mar 29 21:09:21 2021 +0000
description:
lint: add helper functions
No functional change.
diffstat:
usr.bin/xlint/lint1/init.c | 95 ++++++++++++++++++++++++++-------------------
1 files changed, 54 insertions(+), 41 deletions(-)
diffs (204 lines):
diff -r 3531a756bd1b -r 177260d545eb usr.bin/xlint/lint1/init.c
--- a/usr.bin/xlint/lint1/init.c Mon Mar 29 20:52:00 2021 +0000
+++ b/usr.bin/xlint/lint1/init.c Mon Mar 29 21:09:21 2021 +0000
@@ -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 @@
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 @@
}
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 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
static void
initialization_expr(struct initialization *in, tnode_t *tn)
{
- scl_t sclass;
debug_enter();
initialization_debug(in);
@@ -1361,8 +1375,7 @@
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 @@
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);
Home |
Main Index |
Thread Index |
Old Index