Module Name: src
Committed By: rillig
Date: Fri Jun 30 19:10:49 UTC 2023
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_085.c
src/usr.bin/xlint/lint1: cgram.y decl.c externs1.h lint1.h
Log Message:
lint: clean up handling of declarations
No functional change.
To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/tests/usr.bin/xlint/lint1/msg_085.c
cvs rdiff -u -r1.440 -r1.441 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.326 -r1.327 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.180 -r1.181 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.170 -r1.171 src/usr.bin/xlint/lint1/lint1.h
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/msg_085.c
diff -u src/tests/usr.bin/xlint/lint1/msg_085.c:1.6 src/tests/usr.bin/xlint/lint1/msg_085.c:1.7
--- src/tests/usr.bin/xlint/lint1/msg_085.c:1.6 Tue Mar 28 14:44:34 2023
+++ src/tests/usr.bin/xlint/lint1/msg_085.c Fri Jun 30 19:10:49 2023
@@ -1,8 +1,13 @@
-/* $NetBSD: msg_085.c,v 1.6 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: msg_085.c,v 1.7 2023/06/30 19:10:49 rillig Exp $ */
# 3 "msg_085.c"
// Test for message: dubious tag declaration '%s %s' [85]
+/*
+ * Declarations of structs/unions/enums in parameter lists are allowed
+ * but useless.
+ */
+
/* lint1-extra-flags: -X 351 */
/* expect+1: warning: dubious tag declaration 'struct in_argument' [85] */
Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.440 src/usr.bin/xlint/lint1/cgram.y:1.441
--- src/usr.bin/xlint/lint1/cgram.y:1.440 Fri Jun 30 08:03:01 2023
+++ src/usr.bin/xlint/lint1/cgram.y Fri Jun 30 19:10:49 2023
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.440 2023/06/30 08:03:01 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.441 2023/06/30 19:10:49 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.440 2023/06/30 08:03:01 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.441 2023/06/30 19:10:49 rillig Exp $");
#endif
#include <limits.h>
@@ -938,7 +938,7 @@ struct_declaration_list_with_rbrace: /*
struct_declaration_list: /* C99 6.7.2.1 */
struct_declaration
| struct_declaration_list struct_declaration {
- $$ = concat_lists($1, $2);
+ $$ = concat_symbols($1, $2);
}
;
@@ -994,7 +994,7 @@ notype_struct_declarators:
| notype_struct_declarators {
symtyp = FMEMBER;
} T_COMMA type_struct_declarator {
- $$ = concat_lists($1, declare_member($4));
+ $$ = concat_symbols($1, declare_member($4));
}
;
@@ -1005,7 +1005,7 @@ type_struct_declarators:
| type_struct_declarators {
symtyp = FMEMBER;
} T_COMMA type_struct_declarator {
- $$ = concat_lists($1, declare_member($4));
+ $$ = concat_symbols($1, declare_member($4));
}
;
@@ -1091,7 +1091,7 @@ enums_with_opt_comma: /* helper for C99
enumerator_list: /* C99 6.7.2.2 */
enumerator
| enumerator_list T_COMMA enumerator {
- $$ = concat_lists($1, $3);
+ $$ = concat_symbols($1, $3);
}
| error {
$$ = NULL;
@@ -1368,10 +1368,11 @@ array_size:
identifier_list: /* C99 6.7.5 */
T_NAME {
- $$ = old_style_function_name(getsym($1));
+ $$ = old_style_function_parameter_name(getsym($1));
}
| identifier_list T_COMMA T_NAME {
- $$ = concat_lists($1, old_style_function_name(getsym($3)));
+ $$ = concat_symbols($1,
+ old_style_function_parameter_name(getsym($3)));
}
| identifier_list error
;
@@ -1490,7 +1491,7 @@ vararg_parameter_type_list: /* specific
parameter_type_list:
parameter_declaration
| parameter_type_list T_COMMA parameter_declaration {
- $$ = concat_lists($1, $3);
+ $$ = concat_symbols($1, $3);
}
;
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.326 src/usr.bin/xlint/lint1/decl.c:1.327
--- src/usr.bin/xlint/lint1/decl.c:1.326 Fri Jun 30 15:19:09 2023
+++ src/usr.bin/xlint/lint1/decl.c Fri Jun 30 19:10:49 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.326 2023/06/30 15:19:09 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.327 2023/06/30 19:10:49 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.326 2023/06/30 15:19:09 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.327 2023/06/30 19:10:49 rillig Exp $");
#endif
#include <sys/param.h>
@@ -132,9 +132,8 @@ gettyp(tspec_t t)
type_t *
block_dup_type(const type_t *tp)
{
- type_t *ntp;
- ntp = block_zero_alloc(sizeof(*ntp));
+ type_t *ntp = block_zero_alloc(sizeof(*ntp));
*ntp = *tp;
return ntp;
}
@@ -143,9 +142,8 @@ block_dup_type(const type_t *tp)
type_t *
expr_dup_type(const type_t *tp)
{
- type_t *ntp;
- ntp = expr_zero_alloc(sizeof(*ntp));
+ type_t *ntp = expr_zero_alloc(sizeof(*ntp));
*ntp = *tp;
return ntp;
}
@@ -159,9 +157,8 @@ expr_dup_type(const type_t *tp)
type_t *
expr_unqualified_type(const type_t *tp)
{
- type_t *ntp;
- ntp = expr_zero_alloc(sizeof(*ntp));
+ type_t *ntp = expr_zero_alloc(sizeof(*ntp));
*ntp = *tp;
ntp->t_const = false;
ntp->t_volatile = false;
@@ -178,15 +175,15 @@ expr_unqualified_type(const type_t *tp)
}
/*
- * Returns whether the argument is void or an incomplete array,
- * struct, union or enum type.
+ * Returns whether the argument is void or an incomplete array, struct, union
+ * or enum type.
*/
bool
is_incomplete(const type_t *tp)
{
- tspec_t t;
+ tspec_t t = tp->t_tspec;
- if ((t = tp->t_tspec) == VOID)
+ if (t == VOID)
return true;
if (t == ARRAY)
return tp->t_incomplete_array;
@@ -194,7 +191,6 @@ is_incomplete(const type_t *tp)
return tp->t_sou->sou_incomplete;
if (t == ENUM)
return tp->t_enum->en_incomplete;
-
return false;
}
@@ -227,19 +223,17 @@ dcs_add_storage_class(scl_t sc)
}
/*
- * Remember the type, modifier or typedef name returned by the parser
- * in *dcs (top element of decl stack). This information is used in
- * dcs_end_type to build the type used for all declarators in this
- * declaration.
+ * Remember the type, modifier or typedef name returned by the parser in the
+ * top element of the declaration stack. This information is used in
+ * dcs_end_type to build the type used for all declarators in this declaration.
*
- * If tp->t_typedef is true, the type comes from a previously defined
- * typename. Otherwise, it comes from a type specifier (int, long, ...) or a
+ * If tp->t_typedef is true, the type comes from a previously defined typename.
+ * Otherwise, it comes from a type specifier (int, long, ...) or a
* struct/union/enum tag.
*/
void
dcs_add_type(type_t *tp)
{
- tspec_t t;
debug_step("%s: %s", __func__, type_name(tp));
if (tp->t_typedef) {
@@ -256,8 +250,7 @@ dcs_add_type(type_t *tp)
return;
}
- t = tp->t_tspec;
-
+ tspec_t t = tp->t_tspec;
if (is_struct_or_union(t) || t == ENUM) {
/*
* something like "int struct a ..."
@@ -313,19 +306,10 @@ dcs_add_type(type_t *tp)
/* now it can be only a combination of arithmetic types and void */
if (t == SIGNED || t == UNSIGN) {
- /*
- * remember specifiers "signed" & "unsigned" in
- * dcs->d_sign_mod
- */
if (dcs->d_sign_mod != NO_TSPEC)
- /* more than one "signed" and/or "unsigned" */
dcs->d_invalid_type_combination = true;
dcs->d_sign_mod = t;
} else if (t == SHORT || t == LONG || t == QUAD) {
- /*
- * remember specifiers "short", "long" and "long long" in
- * dcs->d_rank_mod
- */
if (dcs->d_rank_mod != NO_TSPEC)
dcs->d_invalid_type_combination = true;
dcs->d_rank_mod = t;
@@ -343,10 +327,6 @@ dcs_add_type(type_t *tp)
} else if (t == PTR) {
dcs->d_type = tp;
} else {
- /*
- * remember specifiers "void", "char", "int",
- * or "_Complex" in dcs->d_abstract_type
- */
if (dcs->d_abstract_type != NO_TSPEC)
dcs->d_invalid_type_combination = true;
dcs->d_abstract_type = t;
@@ -371,15 +351,14 @@ merge_signedness(tspec_t t, tspec_t s)
}
/*
- * called if a list of declaration specifiers contains a typedef name
- * and other specifiers (except struct, union, enum, typedef name)
+ * Called if a list of declaration specifiers contains a typedef name
+ * and other specifiers (except struct, union, enum, typedef name).
*/
static type_t *
typedef_error(type_t *td, tspec_t t)
{
- tspec_t t2;
- t2 = td->t_tspec;
+ tspec_t t2 = td->t_tspec;
if ((t == SIGNED || t == UNSIGN) &&
(t2 == CHAR || t2 == SHORT || t2 == INT ||
@@ -432,31 +411,19 @@ invalid:
return td;
}
-/*
- * Remember the symbol of a typedef name (2nd arg) in a struct, union
- * or enum tag if the typedef name is the first defined for this tag.
- *
- * If the tag is unnamed, the typedef name is used for identification
- * of this tag in lint2. Although it's possible that more than one typedef
- * name is defined for one tag, the first name defined should be unique
- * if the tag is unnamed.
- */
static void
set_first_typedef(type_t *tp, sym_t *sym)
{
- tspec_t t;
- if (is_struct_or_union(t = tp->t_tspec)) {
- if (tp->t_sou->sou_first_typedef == NULL)
- tp->t_sou->sou_first_typedef = sym;
- } else if (t == ENUM) {
- if (tp->t_enum->en_first_typedef == NULL)
- tp->t_enum->en_first_typedef = sym;
- }
+ tspec_t t = tp->t_tspec;
+ if (is_struct_or_union(t) && tp->t_sou->sou_first_typedef == NULL)
+ tp->t_sou->sou_first_typedef = sym;
+ if (t == ENUM && tp->t_enum->en_first_typedef == NULL)
+ tp->t_enum->en_first_typedef = sym;
}
static unsigned int
-bit_field_width(sym_t **mem, bool *named)
+bit_fields_width(sym_t **mem, bool *named)
{
unsigned int width = 0;
unsigned int align = 0;
@@ -488,7 +455,7 @@ pack_struct_or_union(type_t *tp)
mem != NULL; mem = mem->s_next) {
// TODO: Maybe update mem->u.s_member.sm_offset_in_bits.
if (mem->s_type->t_bitfield) {
- bits += bit_field_width(&mem, &named);
+ bits += bit_fields_width(&mem, &named);
if (mem == NULL)
break;
}
@@ -517,12 +484,9 @@ dcs_set_used(void)
}
/*
- * Remember a qualifier which is part of the declaration specifiers
- * (and not the declarator).
- * Also detect multiple qualifiers of the same kind.
-
- * The remembered qualifier is used by dcs_end_type to construct the type
- * for all declarators.
+ * Remember a qualifier that is part of the declaration specifiers (and not the
+ * declarator). The remembered qualifier is used by dcs_end_type for all
+ * declarators.
*/
void
dcs_add_qualifier(tqual_t q)
@@ -546,27 +510,18 @@ dcs_add_qualifier(tqual_t q)
}
}
-/*
- * Go to the next declaration level (structs, nested structs, blocks,
- * argument declaration lists ...)
- */
void
begin_declaration_level(declaration_kind dk)
{
- dinfo_t *di;
- /* put a new element on the declaration stack */
- di = xcalloc(1, sizeof(*di));
+ dinfo_t *di = xcalloc(1, sizeof(*di));
di->d_enclosing = dcs;
- dcs = di;
di->d_kind = dk;
di->d_last_dlsym = &di->d_first_dlsym;
+ dcs = di;
debug_step("%s(%s)", __func__, declaration_kind_name(dk));
}
-/*
- * Go back to previous declaration level
- */
void
end_declaration_level(void)
{
@@ -583,10 +538,9 @@ end_declaration_level(void)
case DK_UNION_MEMBER:
case DK_ENUM_CONSTANT:
/*
- * Symbols declared in (nested) structs or enums are
- * part of the next level (they are removed from the
- * symbol table if the symbols of the outer level are
- * removed).
+ * Symbols declared in (nested) structs or enums are part of
+ * the next level (they are removed from the symbol table if
+ * the symbols of the outer level are removed).
*/
if ((*dcs->d_last_dlsym = di->d_first_dlsym) != NULL)
dcs->d_last_dlsym = di->d_last_dlsym;
@@ -606,9 +560,10 @@ end_declaration_level(void)
break;
case DK_ABSTRACT: /* casts and sizeof */
/*
- * Append all symbols declared in the abstract declaration
- * to the list of symbols declared in the surrounding
- * declaration or block.
+ * Append all symbols declared in the abstract declaration to
+ * the list of symbols declared in the surrounding declaration
+ * or block.
+ *
* XXX I'm not sure whether they should be removed from the
* symbol table now or later.
*/
@@ -616,7 +571,6 @@ end_declaration_level(void)
dcs->d_last_dlsym = di->d_last_dlsym;
break;
case DK_AUTO:
- /* check usage of local vars */
check_usage(di);
/* FALLTHROUGH */
case DK_PROTO_ARG:
@@ -633,21 +587,18 @@ end_declaration_level(void)
}
/*
- * Set flag d_asm in all declaration stack elements up to the
- * outermost one.
+ * Set flag d_asm in all declaration stack elements up to the outermost one.
*
- * This is used to mark compound statements which have, possibly in
- * nested compound statements, asm statements. For these compound
- * statements no warnings about unused or uninitialized variables are
- * printed.
+ * This is used to mark compound statements which have, possibly in nested
+ * compound statements, asm statements. For these compound statements, no
+ * warnings about unused or uninitialized variables are printed.
*
- * There is no need to clear d_asm in dinfo structs with context AUTO,
- * because these structs are freed at the end of the compound statement.
- * But it must be cleared in the outermost dinfo struct, which has
- * context EXTERN. This could be done in dcs_begin_type and would work for
- * C90, but not for C99 or C++ (due to mixed statements and declarations).
- * Thus we clear it in global_clean_up_decl(), which is used to do some
- * cleanup after global declarations/definitions.
+ * There is no need to clear d_asm in dinfo structs with context AUTO, because
+ * these structs are freed at the end of the compound statement. But it must be
+ * cleared in the outermost dinfo struct, which has context EXTERN. This could
+ * be done in dcs_begin_type and would work for C90, but not for C99 or C++
+ * (due to mixed statements and declarations). Thus, we clear it in
+ * global_clean_up_decl.
*/
void
dcs_set_asm(void)
@@ -657,10 +608,6 @@ dcs_set_asm(void)
di->d_asm = true;
}
-/*
- * Clean all elements of the top element of declaration stack which
- * will be used by the next declaration
- */
void
dcs_begin_type(void)
{
@@ -692,7 +639,7 @@ dcs_adjust_storage_class(void)
} else if (dcs->d_kind == DK_OLD_STYLE_ARG ||
dcs->d_kind == DK_PROTO_ARG) {
if (dcs->d_scl != NOSCL && dcs->d_scl != REG) {
- /* only register valid as formal parameter storage... */
+ /* only register valid as formal parameter ... */
error(9);
dcs->d_scl = NOSCL;
}
@@ -768,11 +715,7 @@ dcs_merge_declaration_specifiers(void)
dcs->d_type = gettyp(merge_signedness(t, s));
}
-/*
- * Create a type structure from the information gathered in the declaration
- * stack.
- * Complain about storage classes which are not possible in current context.
- */
+/* Create a type in 'dcs->d_type' from the information gathered in 'dcs'. */
void
dcs_end_type(void)
{
@@ -810,7 +753,8 @@ dcs_end_type(void)
}
/*
- * Return the length of a type in bits.
+ * Return the length of a type in bits. For bit-fields, return the length of
+ * the underlying storage type.
*
* Printing a message if the outermost dimension of an array is 0 must
* be done by the caller. All other problems are reported by this function
@@ -819,56 +763,45 @@ dcs_end_type(void)
int
length_in_bits(const type_t *tp, const char *name)
{
- unsigned int elem, elsz;
- elem = 1;
- while (tp != NULL && tp->t_tspec == ARRAY) {
+ if (tp == NULL)
+ return -1;
+
+ unsigned int elem = 1;
+ while (tp->t_tspec == ARRAY) {
elem *= tp->t_dim;
tp = tp->t_subt;
}
- if (tp == NULL)
- return -1;
- switch (tp->t_tspec) {
- case FUNC:
- lint_assert(/*CONSTCOND*/ false);
- break; /* GCC 10 thinks this were reachable */
- /* NOTREACHED */
- case STRUCT:
- case UNION:
+ if (is_struct_or_union(tp->t_tspec)) {
if (is_incomplete(tp) && name != NULL) {
/* '%s' has incomplete type '%s' */
error(31, name, type_name(tp));
}
- elsz = tp->t_sou->sou_size_in_bits;
- break;
- case ENUM:
- if (is_incomplete(tp) && name != NULL) {
- /* incomplete enum type '%s' */
- warning(13, name);
- }
- /* FALLTHROUGH */
- default:
- elsz = size_in_bits(tp->t_tspec);
- /*
- * Workaround until the type parser (see add_function,
- * add_array, add_pointer) does not construct the invalid
- * intermediate declaration 'void b[4]' for the legitimate
- * declaration 'void *b[4]'.
- */
- if (sytxerr > 0 && elsz == 0)
- elsz = CHAR_SIZE;
- lint_assert(elsz > 0);
- break;
+ return (int)(elem * tp->t_sou->sou_size_in_bits);
}
+
+ if (tp->t_tspec == ENUM && is_incomplete(tp) && name != NULL)
+ /* incomplete enum type '%s' */
+ warning(13, name);
+
+ lint_assert(tp->t_tspec != FUNC);
+
+ unsigned int elsz = size_in_bits(tp->t_tspec);
+ /*
+ * Workaround until the type parser (see add_function, add_array,
+ * add_pointer) does not construct the invalid intermediate declaration
+ * 'void b[4]' for the legitimate declaration 'void *b[4]'.
+ */
+ if (sytxerr > 0 && elsz == 0)
+ elsz = CHAR_SIZE;
+ lint_assert(elsz > 0);
return (int)(elem * elsz);
}
unsigned int
alignment_in_bits(const type_t *tp)
{
- unsigned int a;
- tspec_t t;
/* Super conservative so that it works for most systems. */
unsigned int worst_align_in_bits = 2 * LONG_SIZE;
@@ -876,7 +809,9 @@ alignment_in_bits(const type_t *tp)
while (tp->t_tspec == ARRAY)
tp = tp->t_subt;
- if (is_struct_or_union(t = tp->t_tspec))
+ tspec_t t = tp->t_tspec;
+ unsigned int a;
+ if (is_struct_or_union(t))
a = tp->t_sou->sou_align_in_bits;
else {
lint_assert(t != FUNC);
@@ -884,7 +819,6 @@ alignment_in_bits(const type_t *tp)
a = CHAR_SIZE;
else if (a > worst_align_in_bits)
a = worst_align_in_bits;
-
}
lint_assert(a >= CHAR_SIZE);
lint_assert(a <= worst_align_in_bits);
@@ -896,21 +830,20 @@ alignment_in_bits(const type_t *tp)
* struct/union/enum elements and parameters.
*/
sym_t *
-concat_lists(sym_t *l1, sym_t *l2)
+concat_symbols(sym_t *l1, sym_t *l2)
{
- sym_t *l;
- if ((l = l1) == NULL)
+ if (l1 == NULL)
return l2;
- while (l1->s_next != NULL)
- l1 = l1->s_next;
- l1->s_next = l2;
- return l;
+ sym_t *l = l1;
+ while (l->s_next != NULL)
+ l = l->s_next;
+ l->s_next = l2;
+ return l1;
}
/*
- * Check if the type of the given symbol is valid and print an error
- * message if it is not.
+ * Check if the type of the given symbol is valid.
*
* Invalid types are:
* - arrays of incomplete types or functions
@@ -920,13 +853,12 @@ concat_lists(sym_t *l1, sym_t *l2)
void
check_type(sym_t *sym)
{
- tspec_t to, t;
- type_t **tpp, *tp;
- tpp = &sym->s_type;
- to = NO_TSPEC;
- while ((tp = *tpp) != NULL) {
- t = tp->t_tspec;
+ type_t **tpp = &sym->s_type;
+ tspec_t to = NO_TSPEC;
+ while (*tpp != NULL) {
+ type_t *tp = *tpp;
+ tspec_t t = tp->t_tspec;
/*
* If this is the type of an old-style function definition,
* a better warning is printed in begin_function().
@@ -1059,7 +991,7 @@ check_bit_field_type(sym_t *dsym, type_t
}
static void
-declare_bit_field(sym_t *dsym, tspec_t *inout_t, type_t **const inout_tp)
+check_bit_field(sym_t *dsym, tspec_t *inout_t, type_t **const inout_tp)
{
check_bit_field_type(dsym, inout_tp, inout_t);
@@ -1087,10 +1019,6 @@ declare_bit_field(sym_t *dsym, tspec_t *
sym_t *
declare_member(sym_t *dsym)
{
- type_t *tp;
- tspec_t t;
- int sz;
- unsigned int o = 0; /* Appease GCC */
lint_assert(is_member(dsym));
@@ -1107,10 +1035,10 @@ declare_member(sym_t *dsym)
check_type(dsym);
- t = (tp = dsym->s_type)->t_tspec;
-
+ type_t *tp = dsym->s_type;
+ tspec_t t = tp->t_tspec;
if (dsym->s_bitfield)
- declare_bit_field(dsym, &t, &tp);
+ check_bit_field(dsym, &t, &tp);
else if (t == FUNC) {
/* function illegal in structure or union */
error(38);
@@ -1122,15 +1050,15 @@ declare_member(sym_t *dsym)
* does not return the length of the bit-field but the length
* of the type the bit-field is packed in (it's ok)
*/
- if ((sz = length_in_bits(dsym->s_type, dsym->s_name)) == 0) {
- if (t == ARRAY && dsym->s_type->t_dim == 0) {
- /* zero-sized array '%s' in struct is a C99 extension */
- c99ism(39, dsym->s_name);
- }
+ int sz = length_in_bits(dsym->s_type, dsym->s_name);
+ if (sz == 0 && t == ARRAY && dsym->s_type->t_dim == 0) {
+ /* zero-sized array '%s' in struct is a C99 extension */
+ c99ism(39, dsym->s_name);
}
+ unsigned int union_offset = 0;
if (dcs->d_kind == DK_UNION_MEMBER) {
- o = dcs->d_offset_in_bits;
+ union_offset = dcs->d_offset_in_bits;
dcs->d_offset_in_bits = 0;
}
if (dsym->s_bitfield) {
@@ -1145,8 +1073,8 @@ declare_member(sym_t *dsym)
dsym->u.s_member.sm_offset_in_bits = dcs->d_offset_in_bits;
dcs->d_offset_in_bits += sz;
}
- if (dcs->d_kind == DK_UNION_MEMBER && o > dcs->d_offset_in_bits)
- dcs->d_offset_in_bits = o;
+ if (union_offset > dcs->d_offset_in_bits)
+ dcs->d_offset_in_bits = union_offset;
check_function_definition(dsym, false);
@@ -1202,15 +1130,15 @@ set_bit_field_width(sym_t *dsym, int bit
qual_ptr *
merge_qualified_pointer(qual_ptr *p1, qual_ptr *p2)
{
- qual_ptr *tail;
if (p2 == NULL)
return p1; /* for optional qualifiers */
if (p2->p_pointer) {
/* append p1 to p2, keeping p2 */
- for (tail = p2; tail->p_next != NULL; tail = tail->p_next)
- continue;
+ qual_ptr *tail = p2;
+ while (tail->p_next != NULL)
+ tail = tail->p_next;
tail->p_next = p1;
return p2;
}
@@ -1237,9 +1165,8 @@ merge_qualified_pointer(qual_ptr *p1, qu
static type_t *
block_derive_pointer(type_t *stp, bool is_const, bool is_volatile)
{
- type_t *tp;
- tp = block_derive_type(stp, PTR);
+ type_t *tp = block_derive_type(stp, PTR);
tp->t_const = is_const;
tp->t_volatile = is_volatile;
return tp;
@@ -1373,15 +1300,14 @@ add_function(sym_t *decl, sym_t *args)
/* function prototypes are illegal in traditional C */
warning(270);
args = new_style_function(args);
- } else {
+ } else
old_style_function(decl, args);
- }
/*
* The symbols are removed from the symbol table by
* end_declaration_level after add_function. To be able to restore
* them if this is a function definition, a pointer to the list of
- * all symbols is stored in dcs->d_enclosing->d_func_proto_syms. Also
+ * all symbols is stored in dcs->d_enclosing->d_func_proto_syms. Also,
* a list of the arguments (concatenated by s_next) is stored in
* dcs->d_enclosing->d_func_args. (dcs->d_enclosing must be used
* because *dcs is the declaration stack element created for the list
@@ -1424,22 +1350,17 @@ add_function(sym_t *decl, sym_t *args)
static sym_t *
new_style_function(sym_t *args)
{
- sym_t *arg, *sym;
- scl_t sc;
- /*
- * Declarations of structs/unions/enums in param lists are legal,
- * but senseless.
- */
- for (sym = dcs->d_first_dlsym; sym != NULL; sym = sym->s_level_next) {
- sc = sym->s_scl;
+ for (sym_t *sym = dcs->d_first_dlsym;
+ sym != NULL; sym = sym->s_level_next) {
+ scl_t sc = sym->s_scl;
if (sc == STRUCT_TAG || sc == UNION_TAG || sc == ENUM_TAG) {
/* dubious tag declaration '%s %s' */
warning(85, storage_class_name(sc), sym->s_name);
}
}
- for (arg = args; arg != NULL; arg = arg->s_next) {
+ for (sym_t *arg = args; arg != NULL; arg = arg->s_next) {
if (arg->s_type->t_tspec == VOID &&
!(arg == args && arg->s_next == NULL)) {
/* void must be sole parameter */
@@ -1453,22 +1374,19 @@ new_style_function(sym_t *args)
return args;
}
-/*
- * Called for old-style function declarations.
- */
static void
old_style_function(sym_t *decl, sym_t *args)
{
/*
- * Remember list of parameters only if this really seems to be a
+ * Remember the list of parameters only if this really seems to be a
* function definition.
*/
if (dcs->d_enclosing->d_kind == DK_EXTERN &&
decl->s_type == dcs->d_enclosing->d_type) {
/*
- * We assume that this becomes a function definition. If
- * we are wrong, it's corrected in check_function_definition.
+ * Assume that this becomes a function definition. If not, it
+ * will be corrected in check_function_definition.
*/
if (args != NULL) {
decl->s_osdef = true;
@@ -1500,10 +1418,8 @@ check_function_definition(sym_t *sym, bo
}
/*
- * Process the name in a declarator.
- * The symbol gets one of the storage classes EXTERN, STATIC, AUTO or
- * TYPEDEF.
- * s_def and s_register are valid after declarator_name().
+ * Process the name in a declarator. The symbol gets one of the storage classes
+ * EXTERN, STATIC, AUTO or TYPEDEF, as well as a definedness in 's_def'.
*/
sym_t *
declarator_name(sym_t *sym)
@@ -1532,12 +1448,11 @@ declarator_name(sym_t *sym)
break;
case DK_EXTERN:
/*
- * static and external symbols without "extern" are
- * considered to be tentatively defined, external
- * symbols with "extern" are declared, and typedef names
- * are defined. Tentatively defined and declared symbols
- * may become defined if an initializer is present or
- * this is a function definition.
+ * static and external symbols without "extern" are considered
+ * to be tentatively defined, external symbols with "extern"
+ * are declared, and typedef names are defined. Tentatively
+ * defined and declared symbols may become defined if an
+ * initializer is present or this is a function definition.
*/
if ((sc = dcs->d_scl) == NOSCL) {
sc = EXTERN;
@@ -1567,10 +1482,10 @@ declarator_name(sym_t *sym)
case DK_AUTO:
if ((sc = dcs->d_scl) == NOSCL) {
/*
- * XXX somewhat ugly because we don't know whether
- * this is AUTO or EXTERN (functions). If we are
- * wrong it must be corrected in declare_local(),
- * where we have the necessary type information.
+ * XXX somewhat ugly because we don't know whether this
+ * is AUTO or EXTERN (functions). If we are wrong, it
+ * must be corrected in declare_local, when the
+ * necessary type information is available.
*/
sc = AUTO;
sym->s_def = DEF;
@@ -1585,11 +1500,10 @@ declarator_name(sym_t *sym)
sym->s_def = DECL;
}
break;
- case DK_ABSTRACT: /* try to continue after syntax errors */
- sc = NOSCL;
- break;
default:
- lint_assert(/*CONSTCOND*/false);
+ lint_assert(dcs->d_kind == DK_ABSTRACT);
+ /* try to continue after syntax errors */
+ sc = NOSCL;
}
sym->s_scl = sc;
@@ -1600,12 +1514,8 @@ declarator_name(sym_t *sym)
return sym;
}
-/*
- * Process a name in the list of formal parameters in an old-style function
- * definition.
- */
sym_t *
-old_style_function_name(sym_t *sym)
+old_style_function_parameter_name(sym_t *sym)
{
if (sym->s_scl != NOSCL) {
@@ -1623,14 +1533,12 @@ old_style_function_name(sym_t *sym)
return sym;
}
-/*
- * Create the type of a tag.
- *
- * tag points to the symbol table entry of the tag
- * kind is the kind of the tag (STRUCT/UNION/ENUM)
- * decl is true if the type of the tag will be completed in this declaration
- * (the following token is T_LBRACE)
- * semi is true if the following token is T_SEMI
+/*-
+ * tag the symbol table entry of the tag
+ * kind the kind of the tag (STRUCT/UNION/ENUM)
+ * decl whether the tag type will be completed in this declaration
+ * (when the following token is T_LBRACE)
+ * semi whether the following token is T_SEMI
*/
type_t *
make_tag_type(sym_t *tag, tspec_t kind, bool decl, bool semi)
@@ -1697,10 +1605,11 @@ make_tag_type(sym_t *tag, tspec_t kind,
return tp;
}
-/*
+/*-
* Checks all possible cases of tag redeclarations.
- * decl is true if T_LBRACE follows
- * semi is true if T_SEMI follows
+ *
+ * decl whether T_LBRACE follows
+ * semi whether T_SEMI follows
*/
static sym_t *
new_tag(sym_t *tag, scl_t scl, bool decl, bool semi)
@@ -1807,7 +1716,7 @@ complete_struct_or_union(sym_t *first_me
mem->u.s_member.sm_sou_type = sp;
if (mem->s_type->t_bitfield) {
sp->sou_size_in_bits +=
- bit_field_width(&mem, &has_named_member);
+ bit_fields_width(&mem, &has_named_member);
if (mem == NULL)
break;
}
@@ -2101,7 +2010,8 @@ check_redeclaration(sym_t *dsym, bool *d
print_previous_declaration(rdsym);
return true;
}
- if (!types_compatible(rdsym->s_type, dsym->s_type, false, false, dowarn)) {
+ if (!types_compatible(rdsym->s_type, dsym->s_type,
+ false, false, dowarn)) {
/* redeclaration of '%s' with type '%s', expected '%s' */
error(347, dsym->s_name,
type_name(dsym->s_type), type_name(rdsym->s_type));
@@ -2163,8 +2073,8 @@ pointer_types_are_compatible(const type_
qualifiers_correspond(tp1, tp2, ignqual);
}
-/*
- * ignqual ignore qualifiers of type; used for function parameters
+/*-
+ * ignqual ignore type qualifiers; used for function parameters
* promot promote the left type; used for comparison of parameters of
* old-style function definitions with parameters of prototypes.
* *dowarn is set to true if an old-style function declaration is not
@@ -2263,13 +2173,12 @@ prototypes_compatible(const type_t *tp1,
static bool
matches_no_arg_function(const type_t *tp, bool *dowarn)
{
- sym_t *arg;
- tspec_t t;
if (tp->t_vararg && dowarn != NULL)
*dowarn = true;
- for (arg = tp->t_args; arg != NULL; arg = arg->s_next) {
- if ((t = arg->s_type->t_tspec) == FLOAT ||
+ for (sym_t *arg = tp->t_args; arg != NULL; arg = arg->s_next) {
+ tspec_t t = arg->s_type->t_tspec;
+ if (t == FLOAT ||
t == CHAR || t == SCHAR || t == UCHAR ||
t == SHORT || t == USHORT) {
if (dowarn != NULL)
@@ -2281,25 +2190,23 @@ matches_no_arg_function(const type_t *tp
}
/*
- * Compares a prototype declaration with the remembered arguments of
- * a previous old-style function definition.
+ * Compares a prototype declaration with the remembered arguments of a previous
+ * old-style function definition.
*/
static bool
check_old_style_definition(sym_t *rdsym, sym_t *dsym)
{
- sym_t *args, *pargs, *arg, *parg;
- int narg, nparg, n;
- bool dowarn, msg;
- args = rdsym->u.s_old_style_args;
- pargs = dsym->s_type->t_args;
+ sym_t *args = rdsym->u.s_old_style_args;
+ sym_t *pargs = dsym->s_type->t_args;
- msg = false;
+ bool msg = false;
- narg = nparg = 0;
- for (arg = args; arg != NULL; arg = arg->s_next)
+ int narg = 0;
+ for (sym_t *arg = args; arg != NULL; arg = arg->s_next)
narg++;
- for (parg = pargs; parg != NULL; parg = parg->s_next)
+ int nparg = 0;
+ for (sym_t *parg = pargs; parg != NULL; parg = parg->s_next)
nparg++;
if (narg != nparg) {
/* prototype does not match old-style definition */
@@ -2308,11 +2215,11 @@ check_old_style_definition(sym_t *rdsym,
goto end;
}
- arg = args;
- parg = pargs;
- n = 1;
+ sym_t *arg = args;
+ sym_t *parg = pargs;
+ int n = 1;
while (narg-- > 0) {
- dowarn = false;
+ bool dowarn = false;
/*
* If it does not match due to promotion and lint runs in
* "traditional to C90" migration mode, print only a warning.
@@ -2341,25 +2248,23 @@ end:
}
/*
- * Completes a type by copying the dimension and prototype information
- * from a second compatible type.
+ * Completes a type by copying the dimension and prototype information from a
+ * second compatible type.
*
* Following lines are legal:
* "typedef a[]; a b; a b[10]; a c; a c[20];"
* "typedef ft(); ft f; f(int); ft g; g(long);"
- * This means that, if a type is completed, the type structure must
- * be duplicated.
+ * This means that, if a type is completed, the type structure must be
+ * duplicated.
*/
void
complete_type(sym_t *dsym, sym_t *ssym)
{
- type_t **dstp, *src;
- type_t *dst;
-
- dstp = &dsym->s_type;
- src = ssym->s_type;
+ type_t **dstp = &dsym->s_type;
+ type_t *src = ssym->s_type;
- while ((dst = *dstp) != NULL) {
+ while (*dstp != NULL) {
+ type_t *dst = *dstp;
lint_assert(src != NULL);
lint_assert(dst->t_tspec == src->t_tspec);
if (dst->t_tspec == ARRAY) {
@@ -2386,7 +2291,6 @@ complete_type(sym_t *dsym, sym_t *ssym)
sym_t *
declare_argument(sym_t *sym, bool has_initializer)
{
- tspec_t t;
check_function_definition(sym, true);
@@ -2414,17 +2318,17 @@ declare_argument(sym_t *sym, bool has_in
if (sym->s_type == NULL) /* for c(void()) */
sym->s_type = gettyp(VOID);
- if ((t = sym->s_type->t_tspec) == ARRAY)
+ tspec_t t = sym->s_type->t_tspec;
+ if (t == ARRAY)
sym->s_type = block_derive_type(sym->s_type->t_subt, PTR);
- else if (t == FUNC) {
+ if (t == FUNC) {
if (!allow_c90)
/* argument '%s' has function type, should be ... */
warning(50, sym->s_name);
sym->s_type = block_derive_type(sym->s_type, PTR);
- } else if (t == FLOAT) {
- if (!allow_c90)
- sym->s_type = gettyp(DOUBLE);
}
+ if (t == FLOAT && !allow_c90)
+ sym->s_type = gettyp(DOUBLE);
if (dcs->d_inline)
/* argument '%s' declared inline */
@@ -2525,18 +2429,18 @@ check_func_lint_directives(void)
void
check_func_old_style_arguments(void)
{
- sym_t *args, *arg, *pargs, *parg;
- int narg, nparg;
+ int narg;
+ int nparg;
bool msg;
- args = funcsym->u.s_old_style_args;
- pargs = funcsym->s_type->t_args;
+ sym_t *args = funcsym->u.s_old_style_args;
+ sym_t *pargs = funcsym->s_type->t_args;
/*
* print a warning for each argument of an old-style function
* definition which defaults to int
*/
- for (arg = args; arg != NULL; arg = arg->s_next) {
+ for (sym_t *arg = args; arg != NULL; arg = arg->s_next) {
if (arg->s_defarg) {
/* type of argument '%s' defaults to 'int' */
warning(32, arg->s_name);
@@ -2556,17 +2460,17 @@ check_func_old_style_arguments(void)
*/
narg = nparg = 0;
msg = false;
- for (parg = pargs; parg != NULL; parg = parg->s_next)
+ for (sym_t *parg = pargs; parg != NULL; parg = parg->s_next)
nparg++;
- for (arg = args; arg != NULL; arg = arg->s_next)
+ for (sym_t *arg = args; arg != NULL; arg = arg->s_next)
narg++;
if (narg != nparg) {
/* parameter mismatch: %d declared, %d defined */
error(51, nparg, narg);
msg = true;
} else {
- parg = pargs;
- arg = args;
+ sym_t *parg = pargs;
+ sym_t *arg = args;
while (narg-- > 0) {
msg |= check_prototype_declaration(arg, parg);
parg = parg->s_next;
@@ -2592,13 +2496,9 @@ check_func_old_style_arguments(void)
static bool
check_prototype_declaration(sym_t *arg, sym_t *parg)
{
- type_t *tp, *ptp;
- bool dowarn;
-
- tp = arg->s_type;
- ptp = parg->s_type;
-
- dowarn = false;
+ type_t *tp = arg->s_type;
+ type_t *ptp = parg->s_type;
+ bool dowarn = false;
if (!types_compatible(tp, ptp, true, true, &dowarn)) {
if (types_compatible(tp, ptp, true, false, &dowarn)) {
@@ -2822,58 +2722,50 @@ declare_external_in_block(sym_t *dsym)
}
/*
- * Print an error or a warning if the symbol cannot be initialized due
- * to type/storage class. Return whether an error has been detected.
+ * Check whether the symbol cannot be initialized due to type/storage class.
+ * Return whether an error has been detected.
*/
static bool
check_init(sym_t *sym)
{
- bool erred;
-
- erred = false;
if (sym->s_type->t_tspec == FUNC) {
/* cannot initialize function '%s' */
error(24, sym->s_name);
- erred = true;
- } else if (sym->s_scl == TYPEDEF) {
+ return true;
+ }
+ if (sym->s_scl == TYPEDEF) {
/* cannot initialize typedef '%s' */
error(25, sym->s_name);
- erred = true;
- } else if (sym->s_scl == EXTERN && sym->s_def == DECL) {
+ return true;
+ }
+ if (sym->s_scl == EXTERN && sym->s_def == DECL) {
if (dcs->d_kind == DK_EXTERN) {
/* cannot initialize extern declaration '%s' */
warning(26, sym->s_name);
} else {
/* cannot initialize extern declaration '%s' */
error(26, sym->s_name);
- erred = true;
+ return true;
}
}
- return erred;
+ return false;
}
-/*
- * Create a symbol for an abstract declaration.
- */
+/* Create a symbol for an abstract declaration. */
sym_t *
abstract_name(void)
{
- sym_t *sym;
-
- lint_assert(dcs->d_kind == DK_ABSTRACT ||
- dcs->d_kind == DK_PROTO_ARG);
- sym = block_zero_alloc(sizeof(*sym));
+ lint_assert(dcs->d_kind == DK_ABSTRACT || dcs->d_kind == DK_PROTO_ARG);
+ sym_t *sym = block_zero_alloc(sizeof(*sym));
sym->s_name = unnamed;
sym->s_def = DEF;
sym->s_scl = ABSTRACT;
sym->s_block_level = -1;
-
- if (dcs->d_kind == DK_PROTO_ARG)
- sym->s_arg = true;
+ sym->s_arg = dcs->d_kind == DK_PROTO_ARG;
/*
* At this point, dcs->d_type contains only the basic type. That
@@ -2892,9 +2784,7 @@ abstract_name(void)
return sym;
}
-/*
- * Removes anything which has nothing to do on global level.
- */
+/* Removes anything which has nothing to do on global level. */
void
global_clean_up(void)
{
@@ -2905,11 +2795,6 @@ global_clean_up(void)
clean_up_after_error();
block_level = 0;
mem_block_level = 0;
-
- /*
- * remove all information about pending lint directives without
- * warnings.
- */
global_clean_up_decl(true);
}
@@ -2922,9 +2807,7 @@ declare_abstract_type(sym_t *sym)
return sym;
}
-/*
- * Checks size after declarations of variables and their initialization.
- */
+/* Checks size after declarations of variables and their initialization. */
void
check_size(sym_t *dsym)
{
@@ -2935,19 +2818,16 @@ check_size(sym_t *dsym)
length_in_bits(dsym->s_type, dsym->s_name) == 0 &&
dsym->s_type->t_tspec == ARRAY &&
dsym->s_type->t_dim == 0) {
- if (!allow_c90) {
+ if (!allow_c90)
/* empty array declaration for '%s' */
warning(190, dsym->s_name);
- } else {
+ else
/* empty array declaration for '%s' */
error(190, dsym->s_name);
- }
}
}
-/*
- * Mark an object as set if it is not already
- */
+/* Mark an object as set if it is not already. */
void
mark_as_set(sym_t *sym)
{
@@ -2958,9 +2838,7 @@ mark_as_set(sym_t *sym)
}
}
-/*
- * Mark an object as used if it is not already
- */
+/* Mark an object as used if it is not already. */
void
mark_as_used(sym_t *sym, bool fcall, bool szof)
{
@@ -2980,10 +2858,7 @@ mark_as_used(sym_t *sym, bool fcall, boo
outusg(sym);
}
-/*
- * Prints warnings for a list of variables and labels (concatenated
- * with s_level_next) if these are not used or only set.
- */
+/* Warns about variables and labels that are not used or only set. */
void
check_usage(dinfo_t *di)
{
@@ -2999,10 +2874,7 @@ check_usage(dinfo_t *di)
debug_step("end lwarn %d", lwarn);
}
-/*
- * Prints a warning for a single variable or label if it is not used or
- * only set.
- */
+/* Warns about a variable or a label that is not used or only set. */
void
check_usage_sym(bool novar, sym_t *sym)
{
@@ -3038,8 +2910,6 @@ check_argument_usage(bool novar, sym_t *
static void
check_variable_usage(bool novar, sym_t *sym)
{
- scl_t sc;
- sym_t *xsym;
lint_assert(block_level != 0);
@@ -3055,7 +2925,7 @@ check_variable_usage(bool novar, sym_t *
* XXX Only variables are checked, although types should
* probably also be checked
*/
- sc = sym->s_scl;
+ scl_t sc = sym->s_scl;
if (sc != EXTERN && sc != STATIC && sc != AUTO && sc != REG)
return;
@@ -3091,7 +2961,8 @@ check_variable_usage(bool novar, sym_t *
* because symbols at level 0 only used in sizeof() are
* considered to not be used.
*/
- if ((xsym = sym->s_ext_sym) != NULL) {
+ sym_t *xsym = sym->s_ext_sym;
+ if (xsym != NULL) {
if (sym->s_used && !xsym->s_used) {
xsym->s_used = true;
xsym->s_use_pos = sym->s_use_pos;
@@ -3111,16 +2982,15 @@ check_label_usage(sym_t *lab)
lint_assert(block_level == 1);
lint_assert(lab->s_block_level == 1);
- if (funcsym == NULL) {
+ if (funcsym == NULL)
/* syntax error '%s' */
error(249, "labels are only valid inside a function");
- } else if (lab->s_set && !lab->s_used) {
+ else if (lab->s_set && !lab->s_used)
/* label '%s' unused in function '%s' */
warning_at(232, &lab->s_set_pos, lab->s_name, funcsym->s_name);
- } else if (!lab->s_set) {
+ else if (!lab->s_set)
/* undefined label '%s' */
warning_at(23, &lab->s_use_pos, lab->s_name);
- }
}
static void
@@ -3143,12 +3013,11 @@ check_tag_usage(sym_t *sym)
/* union '%s' never defined */
warning_at(234, &sym->s_def_pos, sym->s_name);
break;
- case ENUM:
+ default:
+ lint_assert(sym->s_type->t_tspec == ENUM);
/* enum '%s' never defined */
warning_at(235, &sym->s_def_pos, sym->s_name);
break;
- default:
- lint_assert(/*CONSTCOND*/false);
}
}
@@ -3240,8 +3109,6 @@ check_global_variable(const sym_t *sym)
static void
check_global_variable_size(const sym_t *sym)
{
- pos_t cpos;
- int len_in_bits;
if (sym->s_def != TDEF)
return;
@@ -3254,9 +3121,9 @@ check_global_variable_size(const sym_t *
return;
}
- cpos = curr_pos;
+ pos_t cpos = curr_pos;
curr_pos = sym->s_def_pos;
- len_in_bits = length_in_bits(sym->s_type, sym->s_name);
+ int len_in_bits = length_in_bits(sym->s_type, sym->s_name);
curr_pos = cpos;
if (len_in_bits == 0 &&
@@ -3305,8 +3172,6 @@ print_previous_declaration(const sym_t *
int
to_int_constant(tnode_t *tn, bool required)
{
- int i;
- tspec_t t;
if (tn == NULL)
return 1;
@@ -3322,7 +3187,9 @@ to_int_constant(tnode_t *tn, bool requir
if (tn->tn_op != CON && dcs->d_kind != DK_ABSTRACT)
expr_free_all();
- if ((t = v->v_tspec) == FLOAT || t == DOUBLE || t == LDOUBLE) {
+ tspec_t t = v->v_tspec;
+ int i;
+ if (t == FLOAT || t == DOUBLE || t == LDOUBLE) {
i = (int)v->v_ldbl;
/* integral constant expression expected */
error(55);
Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.180 src/usr.bin/xlint/lint1/externs1.h:1.181
--- src/usr.bin/xlint/lint1/externs1.h:1.180 Thu Jun 29 09:58:36 2023
+++ src/usr.bin/xlint/lint1/externs1.h Fri Jun 30 19:10:49 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: externs1.h,v 1.180 2023/06/29 09:58:36 rillig Exp $ */
+/* $NetBSD: externs1.h,v 1.181 2023/06/30 19:10:49 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -201,7 +201,7 @@ void dcs_begin_type(void);
void dcs_end_type(void);
int length_in_bits(const type_t *, const char *);
unsigned int alignment_in_bits(const type_t *);
-sym_t *concat_lists(sym_t *, sym_t *);
+sym_t *concat_symbols(sym_t *, sym_t *);
void check_type(sym_t *);
sym_t *declare_member(sym_t *);
sym_t *set_bit_field_width(sym_t *, int);
@@ -211,7 +211,7 @@ sym_t *add_array(sym_t *, bool, int);
sym_t *add_function(sym_t *, sym_t *);
void check_function_definition(sym_t *, bool);
sym_t *declarator_name(sym_t *);
-sym_t *old_style_function_name(sym_t *);
+sym_t *old_style_function_parameter_name(sym_t *);
type_t *make_tag_type(sym_t *, tspec_t, bool, bool);
const char *storage_class_name(scl_t);
type_t *complete_struct_or_union(sym_t *);
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.170 src/usr.bin/xlint/lint1/lint1.h:1.171
--- src/usr.bin/xlint/lint1/lint1.h:1.170 Thu Jun 29 22:52:44 2023
+++ src/usr.bin/xlint/lint1/lint1.h Fri Jun 30 19:10:49 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.170 2023/06/29 22:52:44 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.171 2023/06/30 19:10:49 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -347,9 +347,11 @@ typedef enum declaration_kind {
} declaration_kind;
/*
- * For nested declarations there is a stack that holds all information
- * needed for the current level. dcs points to the innermost element of this
- * stack.
+ * A declaration level describes a struct, union, enum, block, argument
+ * declaration list or an abstract (unnamed) type.
+ *
+ * For nested declarations, the global 'dcs' holds all information needed for
+ * the current level, the outer levels are available via 'd_enclosing'.
*/
typedef struct dinfo {
declaration_kind d_kind;