Module Name: src
Committed By: rillig
Date: Fri Mar 29 08:35:32 UTC 2024
Modified Files:
src/usr.bin/xlint: Makefile.inc
src/usr.bin/xlint/lint1: cgram.y decl.c externs1.h func.c init.c lex.c
tree.c
Log Message:
lint: clean up
To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/usr.bin/xlint/Makefile.inc
cvs rdiff -u -r1.492 -r1.493 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.396 -r1.397 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.220 -r1.221 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.185 -r1.186 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.265 -r1.266 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.222 -r1.223 src/usr.bin/xlint/lint1/lex.c
cvs rdiff -u -r1.628 -r1.629 src/usr.bin/xlint/lint1/tree.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/Makefile.inc
diff -u src/usr.bin/xlint/Makefile.inc:1.28 src/usr.bin/xlint/Makefile.inc:1.29
--- src/usr.bin/xlint/Makefile.inc:1.28 Tue Jan 23 19:44:28 2024
+++ src/usr.bin/xlint/Makefile.inc Fri Mar 29 08:35:31 2024
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.28 2024/01/23 19:44:28 rillig Exp $
+# $NetBSD: Makefile.inc,v 1.29 2024/03/29 08:35:31 rillig Exp $
.include <bsd.own.mk>
@@ -23,9 +23,7 @@ CLEANFILES+= *.gcno *.gcda *.gcov
CFLAGS+= ${ACTIVE_CC:Mgcc:%=-ftrapv}
.endif
-.if exists(${.CURDIR}/../../Makefile.inc)
.include "${.CURDIR}/../../Makefile.inc"
-.endif
LINTFLAGS+= -aa # warn about all lossy conversions
LINTFLAGS+= -e # strict enum mode
Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.492 src/usr.bin/xlint/lint1/cgram.y:1.493
--- src/usr.bin/xlint/lint1/cgram.y:1.492 Wed Mar 27 21:14:09 2024
+++ src/usr.bin/xlint/lint1/cgram.y Fri Mar 29 08:35:32 2024
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.492 2024/03/27 21:14:09 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.493 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.492 2024/03/27 21:14:09 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.493 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <limits.h>
@@ -77,7 +77,7 @@ static void
clear_warning_flags_loc(const char *file, size_t line)
{
debug_step("%s:%zu: clearing flags", file, line);
- clear_warn_flags();
+ reset_suppressions();
saved_lwarn = LWARN_NOTHING_SAVED;
}
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.396 src/usr.bin/xlint/lint1/decl.c:1.397
--- src/usr.bin/xlint/lint1/decl.c:1.396 Sat Mar 9 13:20:55 2024
+++ src/usr.bin/xlint/lint1/decl.c Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.396 2024/03/09 13:20:55 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.397 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: decl.c,v 1.396 2024/03/09 13:20:55 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.397 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <sys/param.h>
@@ -1072,7 +1072,7 @@ declare_member(sym_t *dsym)
rdsym->u.s_member.sm_containing_type) {
/* duplicate member name '%s' */
error(33, dsym->s_name);
- rmsym(rdsym);
+ symtab_remove_forever(rdsym);
}
}
@@ -1169,14 +1169,6 @@ block_derive_pointer(type_t *stp, bool i
return tp;
}
-/*
- * The following 3 functions extend the type of a declarator with
- * pointer, function and array types.
- *
- * The current type is the type built by dcs_end_type (dcs->d_type) and
- * pointer, function and array types already added for this
- * declarator. The new type extension is inserted between both.
- */
sym_t *
add_pointer(sym_t *decl, qual_ptr *p)
{
@@ -1205,23 +1197,19 @@ add_pointer(sym_t *decl, qual_ptr *p)
}
static type_t *
-block_derive_array(type_t *stp, bool dim, int len)
+block_derive_array(type_t *stp, bool has_dim, int dim)
{
type_t *tp = block_derive_type(stp, ARRAY);
- tp->u.dimension = len;
+ tp->u.dimension = dim;
#if 0
/*
- * As of 2022-04-03, the implementation of the type parser (see
- * add_function, add_array, add_pointer) is strange. When it sees the
- * type 'void *b[4]', it first creates 'void b[4]' and only later
- * inserts the '*' in the middle of the type. Late modifications like
- * these should not be done at all, instead the parser should be fixed
- * to process the type names in the proper syntactical order.
- *
- * Since the intermediate type would be an array of void, but the final
- * type is valid, this check cannot be enabled yet.
+ * When the type of the declaration 'void *b[4]' is constructed (see
+ * add_function, add_array, add_pointer), the intermediate type
+ * 'void[4]' is invalid and only later gets the '*' inserted in the
+ * middle of the type. Due to the invalid intermediate type, this
+ * check cannot be enabled yet.
*/
if (stp->t_tspec == VOID) {
/* array of incomplete type */
@@ -1229,25 +1217,21 @@ block_derive_array(type_t *stp, bool dim
tp->t_subt = gettyp(CHAR);
}
#endif
- if (len < 0)
+ if (dim < 0)
/* negative array dimension (%d) */
- error(20, len);
- else if (len == 0 && dim)
+ error(20, dim);
+ else if (dim == 0 && has_dim)
/* zero sized array requires C99 or later */
c99ism(322);
- else if (len == 0 && !dim)
+ else if (dim == 0 && !has_dim)
tp->t_incomplete_array = true;
debug_step("%s: '%s'", __func__, type_name(tp));
return tp;
}
-/*
- * If a dimension was specified, dim is true, otherwise false
- * n is the specified dimension
- */
sym_t *
-add_array(sym_t *decl, bool dim, int n)
+add_array(sym_t *decl, bool has_dim, int dim)
{
debug_dcs();
@@ -1259,7 +1243,7 @@ add_array(sym_t *decl, bool dim, int n)
lint_assert(*tpp != NULL);
}
- *tpp = block_derive_array(dcs->d_type, dim, n);
+ *tpp = block_derive_array(dcs->d_type, has_dim, dim);
debug_step("%s: '%s'", __func__, type_name(decl->s_type));
return decl;
@@ -1980,7 +1964,7 @@ declare_extern(sym_t *dsym, bool has_ini
complete_type(dsym, rdsym);
}
- rmsym(rdsym);
+ symtab_remove_forever(rdsym);
}
if (dsym->s_scl == TYPEDEF) {
@@ -2299,7 +2283,7 @@ declare_parameter(sym_t *sym, bool has_i
dcs->d_redeclared_symbol->s_block_level == block_level) {
/* redeclaration of formal parameter '%s' */
error(237, sym->s_name);
- rmsym(dcs->d_redeclared_symbol);
+ symtab_remove_forever(dcs->d_redeclared_symbol);
sym->s_param = true;
}
@@ -2564,7 +2548,7 @@ check_local_redeclaration(const sym_t *d
if (hflag)
/* declaration of '%s' hides ... */
warning(91, dsym->s_name);
- rmsym(rdsym);
+ symtab_remove_forever(rdsym);
}
}
@@ -2575,7 +2559,7 @@ check_local_redeclaration(const sym_t *d
if (rdsym->s_block_level == block_level) {
/* redeclaration of '%s' */
error(27, dsym->s_name);
- rmsym(rdsym);
+ symtab_remove_forever(rdsym);
}
}
@@ -2741,7 +2725,7 @@ abstract_name_level(bool enclosing)
* will be updated later, adding pointers, arrays and functions as
* necessary.
*/
- sym->s_type = (enclosing ? dcs->d_enclosing : dcs)->d_type;
+ sym->s_type = enclosing ? dcs->d_enclosing->d_type : dcs->d_type;
dcs->d_redeclared_symbol = NULL;
debug_printf("%s: ", __func__);
Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.220 src/usr.bin/xlint/lint1/externs1.h:1.221
--- src/usr.bin/xlint/lint1/externs1.h:1.220 Thu Mar 28 21:04:48 2024
+++ src/usr.bin/xlint/lint1/externs1.h Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: externs1.h,v 1.220 2024/03/28 21:04:48 rillig Exp $ */
+/* $NetBSD: externs1.h,v 1.221 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -85,12 +85,12 @@ extern FILE *yyin;
void init_lex(void);
int64_t convert_integer(int64_t, tspec_t, unsigned int);
-void clear_warn_flags(void);
+void reset_suppressions(void);
sym_t *getsym(sbuf_t *);
void clean_up_after_error(void);
sym_t *pushdown(const sym_t *);
sym_t *mktempsym(type_t *);
-void rmsym(sym_t *);
+void symtab_remove_forever(sym_t *);
void symtab_remove_level(sym_t *);
void inssym(int, sym_t *);
void freeyyv(void *, int);
Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.185 src/usr.bin/xlint/lint1/func.c:1.186
--- src/usr.bin/xlint/lint1/func.c:1.185 Wed Mar 27 19:28:20 2024
+++ src/usr.bin/xlint/lint1/func.c Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.185 2024/03/27 19:28:20 rillig Exp $ */
+/* $NetBSD: func.c,v 1.186 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.185 2024/03/27 19:28:20 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.186 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <stdlib.h>
@@ -308,8 +308,7 @@ begin_function(sym_t *fsym)
fsym->s_inline = true;
}
- /* remove the old symbol from the symbol table */
- rmsym(rdsym);
+ symtab_remove_forever(rdsym);
}
if (fsym->s_osdef && !fsym->s_type->t_proto) {
Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.265 src/usr.bin/xlint/lint1/init.c:1.266
--- src/usr.bin/xlint/lint1/init.c:1.265 Fri Mar 29 07:35:45 2024
+++ src/usr.bin/xlint/lint1/init.c Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.265 2024/03/29 07:35:45 rillig Exp $ */
+/* $NetBSD: init.c,v 1.266 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: init.c,v 1.265 2024/03/29 07:35:45 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.266 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <stdlib.h>
@@ -105,12 +105,7 @@ typedef struct brace_level {
struct brace_level *bl_enclosing;
} brace_level;
-/*
- * An ongoing initialization.
- *
- * In most cases there is only ever a single initialization at a time. See
- * pointer_to_compound_literal in msg_171.c for a real-life counterexample.
- */
+/* An ongoing initialization. */
typedef struct initialization {
/* The symbol that is to be initialized. */
sym_t *in_sym;
@@ -173,13 +168,6 @@ can_init_character_array(const type_t *l
: lst == WCHAR_TSPEC;
}
-/*
- * C11 6.7.9p9 seems to say that all unnamed members are skipped. C11 6.7.2.1p8
- * suggests an exception to that rule, and together with C11 6.7.2.1p13, it
- * says that the members from an anonymous struct/union member are "considered
- * to be members of the containing structure or union", thereby preventing that
- * the containing structure or union has only unnamed members.
- */
static const sym_t *
skip_unnamed(const sym_t *m)
{
@@ -198,10 +186,6 @@ first_named_member(const type_t *tp)
return skip_unnamed(tp->u.sou->sou_first_member);
}
-/*
- * C99 6.7.8p22 says that the type of an array of unknown size becomes known
- * at the end of its initializer list.
- */
static void
update_type_of_array_of_unknown_size(sym_t *sym, size_t size)
{
@@ -214,8 +198,6 @@ update_type_of_array_of_unknown_size(sym
outsym(sym, sym->s_scl, sym->s_def);
}
-
-/* In traditional C, bit-fields can be initialized only by integer constants. */
static void
check_bit_field_init(const tnode_t *ln, tspec_t lt, tspec_t rt)
{
@@ -275,27 +257,19 @@ check_init_expr(const type_t *ltp, sym_t
rn = cconv(rn);
- tspec_t lt = ln->tn_type->t_tspec;
- tspec_t rt = rn->tn_type->t_tspec;
-
debug_step("typeok '%s', '%s'",
type_name(ln->tn_type), type_name(rn->tn_type));
if (!typeok(INIT, 0, ln, rn))
return;
- /*
- * Preserve the tree memory. This is necessary because otherwise expr()
- * would free it.
- */
memory_pool saved_mem = expr_save_memory();
expr(rn, true, false, true, false);
expr_restore_memory(saved_mem);
+ tspec_t lt = ln->tn_type->t_tspec;
+ tspec_t rt = rn->tn_type->t_tspec;
check_bit_field_init(ln, lt, rt);
- /*
- * XXX: Is it correct to do this conversion _after_ the typeok above?
- */
if (lt != rt || (ltp->t_bitfield && rn->tn_op == CON))
rn = convert(INIT, 0, unconst_cast(ltp), rn);
@@ -515,7 +489,6 @@ brace_level_advance(brace_level *bl, siz
(void)designation_descend(dn, bl->bl_type);
designator *dr = designation_last(dn);
- /* TODO: try to switch on dr->dr_kind instead */
switch (tp->t_tspec) {
case STRUCT:
lint_assert(dr->dr_member != NULL);
@@ -594,12 +567,7 @@ brace_level_pop_final(brace_level *bl, s
}
}
-/*
- * Make the designation point to the sub-object to be initialized next.
- * Initially or after a previous expression, the designation is not advanced
- * yet since the place to stop depends on the next expression, especially for
- * string literals.
- */
+/* Make the designation point to the sub-object to be initialized next. */
static bool
brace_level_goto(brace_level *bl, const tnode_t *rn, size_t *max_subscript)
{
@@ -646,7 +614,6 @@ initialization_free(initialization *in)
{
brace_level *bl, *next;
- /* TODO: lint_assert(in->in_brace_level == NULL) */
for (bl = in->in_brace_level; bl != NULL; bl = next) {
next = bl->bl_enclosing;
brace_level_free(bl);
Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.222 src/usr.bin/xlint/lint1/lex.c:1.223
--- src/usr.bin/xlint/lint1/lex.c:1.222 Sun Mar 3 16:09:01 2024
+++ src/usr.bin/xlint/lint1/lex.c Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.222 2024/03/03 16:09:01 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.223 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: lex.c,v 1.222 2024/03/03 16:09:01 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.223 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <ctype.h>
@@ -478,18 +478,6 @@ lex_name(const char *yytext, size_t yyle
return T_NAME;
}
-// Determines whether the constant is signed in traditional C but unsigned in
-// C90 and later.
-static bool
-is_unsigned_since_c90(unsigned ls, uint64_t ui, int base)
-{
- if (ui <= TARG_INT_MAX)
- return false;
- if (ls == 0 && ui <= TARG_UINT_MAX && base != 10)
- return true;
- return ls <= 1 && ui > TARG_LONG_MAX;
-}
-
static tspec_t
integer_constant_type_signed(unsigned ls, uint64_t ui, int base, bool warned)
{
@@ -595,12 +583,14 @@ lex_integer_constant(const char *yytext,
query_message(8, (int)len, cp);
bool unsigned_since_c90 = allow_trad && allow_c90 && u_suffix == 0
- && is_unsigned_since_c90(l_suffix, ui, base);
+ && ui > TARG_INT_MAX
+ && ((l_suffix == 0 && base != 10 && ui <= TARG_UINT_MAX)
+ || (l_suffix <= 1 && ui > TARG_LONG_MAX));
tspec_t t = u_suffix > 0
? integer_constant_type_unsigned(l_suffix, ui, warned)
: integer_constant_type_signed(l_suffix, ui, base, warned);
- ui = (uint64_t)convert_integer((int64_t)ui, t, 0);
+ ui = (uint64_t)convert_integer((int64_t)ui, t, size_in_bits(t));
yylval.y_val = xcalloc(1, sizeof(*yylval.y_val));
yylval.y_val->v_tspec = t;
@@ -610,22 +600,14 @@ lex_integer_constant(const char *yytext,
return T_CON;
}
-/*
- * Extend or truncate si to match t. If t is signed, sign-extend.
- *
- * len is the number of significant bits. If len is 0, len is set
- * to the width of type t.
- */
+/* Extend or truncate si to match t. If t is signed, sign-extend. */
int64_t
-convert_integer(int64_t si, tspec_t t, unsigned int len)
+convert_integer(int64_t si, tspec_t t, unsigned int bits)
{
- if (len == 0)
- len = size_in_bits(t);
-
- uint64_t vbits = value_bits(len);
+ uint64_t vbits = value_bits(bits);
uint64_t ui = (uint64_t)si;
- return t == PTR || is_uinteger(t) || ((ui & bit(len - 1)) == 0)
+ return t == PTR || is_uinteger(t) || ((ui & bit(bits - 1)) == 0)
? (int64_t)(ui & vbits)
: (int64_t)(ui | ~vbits);
}
@@ -984,9 +966,7 @@ lex_character_constant(void)
return T_CON;
}
-/*
- * Called if lex found a leading L\'
- */
+/* Called if lex found a leading "L'". */
int
lex_wide_character_constant(void)
{
@@ -1169,9 +1149,6 @@ lex_comment(void)
{ "VARARGS", true, LC_VARARGS },
};
char keywd[32];
- char arg[32];
- size_t l, i;
- int a;
bool seen_end_of_comment = false;
@@ -1179,7 +1156,7 @@ lex_comment(void)
continue;
/* Read the potential keyword to keywd */
- l = 0;
+ size_t l = 0;
while (c != EOF && l < sizeof(keywd) - 1 &&
(isalpha(c) || isspace(c))) {
if (islower(c) && l > 0 && isupper((unsigned char)keywd[0]))
@@ -1192,6 +1169,7 @@ lex_comment(void)
keywd[l] = '\0';
/* look for the keyword */
+ size_t i;
for (i = 0; i < sizeof(keywtab) / sizeof(keywtab[0]); i++)
if (strcmp(keywtab[i].name, keywd) == 0)
goto found_keyword;
@@ -1202,6 +1180,7 @@ found_keyword:
c = read_byte();
/* read the argument, if the keyword accepts one and there is one */
+ char arg[32];
l = 0;
if (keywtab[i].arg) {
while (isdigit(c) && l < sizeof(arg) - 1) {
@@ -1210,7 +1189,7 @@ found_keyword:
}
}
arg[l] = '\0';
- a = l != 0 ? atoi(arg) : -1;
+ int a = l != 0 ? atoi(arg) : -1;
while (isspace(c))
c = read_byte();
@@ -1238,25 +1217,17 @@ skip_rest:
void
lex_slash_slash_comment(void)
{
- int c;
if (!allow_c99 && !allow_gcc)
/* %s does not support '//' comments */
gnuism(312, allow_c90 ? "C90" : "traditional C");
- while ((c = read_byte()) != EOF && c != '\n')
+ for (int c; c = read_byte(), c != EOF && c != '\n';)
continue;
}
-/*
- * Clear flags for lint comments LINTED, LONGLONG and CONSTCOND.
- * clear_warn_flags is called after function definitions and global and
- * local declarations and definitions. It is also called between
- * the controlling expression and the body of control statements
- * (if, switch, for, while).
- */
void
-clear_warn_flags(void)
+reset_suppressions(void)
{
lwarn = LWARN_ALL;
@@ -1367,7 +1338,6 @@ getsym(sbuf_t *sb)
/* create a new symbol table entry */
- /* labels must always be allocated at level 1 (outermost block) */
decl_level *dl;
if (sym_kind == SK_LABEL) {
sym = level_zero_alloc(1, sizeof(*sym), "sym");
@@ -1440,12 +1410,11 @@ mktempsym(type_t *tp)
return sym;
}
-/* Remove a symbol forever from the symbol table. */
void
-rmsym(sym_t *sym)
+symtab_remove_forever(sym_t *sym)
{
- debug_step("rmsym '%s' %s '%s'",
+ debug_step("%s '%s' %s '%s'", __func__,
sym->s_name, symbol_kind_name(sym->s_kind),
type_name(sym->s_type));
symtab_remove(sym);
@@ -1488,11 +1457,6 @@ inssym(int level, sym_t *sym)
sym->s_block_level = level;
symtab_add(sym);
- /*
- * Placing the inner symbols to the beginning of the list ensures that
- * these symbols are preferred over symbols from the outer blocks that
- * happen to have the same name.
- */
const sym_t *next = sym->s_symtab_next;
if (next != NULL)
lint_assert(sym->s_block_level >= next->s_block_level);
@@ -1513,12 +1477,12 @@ clean_up_after_error(void)
sym_t *
pushdown(const sym_t *sym)
{
- sym_t *nsym;
debug_step("pushdown '%s' %s '%s'",
sym->s_name, symbol_kind_name(sym->s_kind),
type_name(sym->s_type));
- nsym = block_zero_alloc(sizeof(*nsym), "sym");
+
+ sym_t *nsym = block_zero_alloc(sizeof(*nsym), "sym");
lint_assert(sym->s_block_level <= block_level);
nsym->s_name = sym->s_name;
nsym->s_def_pos = unique_curr_pos();
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.628 src/usr.bin/xlint/lint1/tree.c:1.629
--- src/usr.bin/xlint/lint1/tree.c:1.628 Wed Mar 27 20:09:43 2024
+++ src/usr.bin/xlint/lint1/tree.c Fri Mar 29 08:35:32 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.628 2024/03/27 20:09:43 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.629 2024/03/29 08:35:32 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.628 2024/03/27 20:09:43 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.629 2024/03/29 08:35:32 rillig Exp $");
#endif
#include <float.h>
@@ -1014,7 +1014,7 @@ fold_constant_integer(tnode_t *tn)
val_t *v = xcalloc(1, sizeof(*v));
v->v_tspec = tn->tn_type->t_tspec;
- v->u.integer = convert_integer(res, t, 0);
+ v->u.integer = convert_integer(res, t, size_in_bits(t));
tnode_t *cn = build_constant(tn->tn_type, v);
if (tn->u.ops.left->tn_system_dependent)
@@ -1963,7 +1963,7 @@ remove_unknown_member(tnode_t *tn, sym_t
{
/* type '%s' does not have member '%s' */
error(101, type_name(tn->tn_type), msym->s_name);
- rmsym(msym);
+ symtab_remove_forever(msym);
msym->s_kind = SK_MEMBER;
msym->s_scl = STRUCT_MEMBER;