Module Name: src Committed By: rillig Date: Sat Apr 9 23:41:22 UTC 2022
Modified Files: src/usr.bin/xlint/lint1: cgram.y debug.c decl.c externs1.h func.c lex.c lint1.h tree.c Log Message: lint: distinguish between storage class and declaration kind These types overlap but are not the same. No functional change. To generate a diff of this commit: cvs rdiff -u -r1.392 -r1.393 src/usr.bin/xlint/lint1/cgram.y cvs rdiff -u -r1.16 -r1.17 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.275 -r1.276 src/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.153 -r1.154 src/usr.bin/xlint/lint1/externs1.h cvs rdiff -u -r1.131 -r1.132 src/usr.bin/xlint/lint1/func.c cvs rdiff -u -r1.117 -r1.118 src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.149 -r1.150 src/usr.bin/xlint/lint1/lint1.h cvs rdiff -u -r1.423 -r1.424 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/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.392 src/usr.bin/xlint/lint1/cgram.y:1.393 --- src/usr.bin/xlint/lint1/cgram.y:1.392 Sat Apr 9 21:19:52 2022 +++ src/usr.bin/xlint/lint1/cgram.y Sat Apr 9 23:41:22 2022 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.392 2022/04/09 21:19:52 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.393 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: cgram.y,v 1.392 2022/04/09 21:19:52 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.393 2022/04/09 23:41:22 rillig Exp $"); #endif #include <limits.h> @@ -920,7 +920,7 @@ struct_or_union_specifier: /* C99 6.7.2. struct_or_union: /* C99 6.7.2.1 */ T_STRUCT_OR_UNION { symtyp = FTAG; - begin_declaration_level($1 == STRUCT ? MOS : MOU); + begin_declaration_level($1 == STRUCT ? DK_MOS : DK_MOU); dcs->d_offset_in_bits = 0; dcs->d_sou_align_in_bits = CHAR_SIZE; $$ = $1; @@ -1069,7 +1069,7 @@ enum_specifier: /* C99 6.7.2.2 */ enum: /* helper for C99 6.7.2.2 */ T_ENUM { symtyp = FTAG; - begin_declaration_level(ENUM_CONST); + begin_declaration_level(DK_ENUM_CONST); } ; @@ -1329,7 +1329,7 @@ param_list: id_list_lparen: T_LPAREN { block_level++; - begin_declaration_level(PROTO_ARG); + begin_declaration_level(DK_PROTO_ARG); } ; @@ -1380,7 +1380,7 @@ identifier_list: /* C99 6.7.5 */ /* XXX: C99 requires an additional specifier-qualifier-list. */ type_name: /* C99 6.7.6 */ { - begin_declaration_level(ABSTRACT); + begin_declaration_level(DK_ABSTRACT); } abstract_declaration { end_declaration_level(); $$ = $2->s_type; @@ -1460,7 +1460,7 @@ abstract_decl_param_list: /* specific to abstract_decl_lparen: /* specific to lint */ T_LPAREN { block_level++; - begin_declaration_level(PROTO_ARG); + begin_declaration_level(DK_PROTO_ARG); } ; @@ -1674,7 +1674,7 @@ compound_statement_lbrace: T_LBRACE { block_level++; mem_block_level++; - begin_declaration_level(AUTO); + begin_declaration_level(DK_AUTO); } ; @@ -1824,7 +1824,7 @@ do_while_expr: /* see C99 6.8.5 */ for_start: /* see C99 6.8.5 */ T_FOR T_LPAREN { - begin_declaration_level(AUTO); + begin_declaration_level(DK_AUTO); block_level++; } ; @@ -1960,7 +1960,7 @@ function_definition: /* C99 6.9.1 */ } funcdef($1); block_level++; - begin_declaration_level(OLD_STYLE_ARG); + begin_declaration_level(DK_OLD_STYLE_ARG); if (lwarn == LWARN_NONE) $1->s_used = true; } arg_declaration_list_opt { Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.16 src/usr.bin/xlint/lint1/debug.c:1.17 --- src/usr.bin/xlint/lint1/debug.c:1.16 Sat Apr 9 21:19:52 2022 +++ src/usr.bin/xlint/lint1/debug.c Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.16 2022/04/09 21:19:52 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.17 2022/04/09 23:41:22 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: debug.c,v 1.16 2022/04/09 21:19:52 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.17 2022/04/09 23:41:22 rillig Exp $"); #endif #include <stdlib.h> @@ -177,6 +177,23 @@ def_name(def_t def) } const char * +declaration_kind_name(declaration_kind dk) +{ + static const char *const name[] = { + "extern", + "member-of-struct", + "member-of-union", + "enum-constant", + "old-style-function-argument", + "prototype-argument", + "auto", + "abstract", + }; + + return name[dk]; +} + +const char * scl_name(scl_t scl) { static const char *const name[] = { @@ -191,8 +208,6 @@ scl_name(scl_t scl) "enum", "member-of-struct", "member-of-union", - "bool-constant", - "enum-constant", "abstract", "old-style-function-argument", "prototype-argument", @@ -308,7 +323,7 @@ debug_dinfo(const dinfo_t *d) // NOLINT( { debug_print_indent(); - debug_printf("dinfo: %s", scl_name(d->d_ctx)); + debug_printf("dinfo: %s", declaration_kind_name(d->d_kind)); if (d->d_scl != NOSCL) debug_printf(" %s", scl_name(d->d_scl)); if (d->d_type != NULL) { Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.275 src/usr.bin/xlint/lint1/decl.c:1.276 --- src/usr.bin/xlint/lint1/decl.c:1.275 Sat Apr 9 21:19:52 2022 +++ src/usr.bin/xlint/lint1/decl.c Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.275 2022/04/09 21:19:52 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.276 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: decl.c,v 1.275 2022/04/09 21:19:52 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.276 2022/04/09 23:41:22 rillig Exp $"); #endif #include <sys/param.h> @@ -95,7 +95,7 @@ initdecl(void) /* declaration stack */ dcs = xcalloc(1, sizeof(*dcs)); - dcs->d_ctx = EXTERN; + dcs->d_kind = DK_EXTERN; dcs->d_ldlsym = &dcs->d_dlsyms; /* type information and classification */ @@ -574,7 +574,7 @@ add_qualifier(tqual_t q) * argument declaration lists ...) */ void -begin_declaration_level(scl_t sc) +begin_declaration_level(declaration_kind dk) { dinfo_t *di; @@ -582,9 +582,9 @@ begin_declaration_level(scl_t sc) di = xcalloc(1, sizeof(*di)); di->d_enclosing = dcs; dcs = di; - di->d_ctx = sc; + di->d_kind = dk; di->d_ldlsym = &di->d_dlsyms; - debug_step("%s(%s)", __func__, scl_name(sc)); + debug_step("%s(%s)", __func__, declaration_kind_name(dk)); } /* @@ -595,15 +595,15 @@ end_declaration_level(void) { dinfo_t *di; - debug_step("%s(%s)", __func__, scl_name(dcs->d_ctx)); + debug_step("%s(%s)", __func__, declaration_kind_name(dcs->d_kind)); lint_assert(dcs->d_enclosing != NULL); di = dcs; dcs = di->d_enclosing; - switch (di->d_ctx) { - case MOS: - case MOU: - case ENUM_CONST: + switch (di->d_kind) { + case DK_MOS: + case DK_MOU: + case DK_ENUM_CONST: /* * Symbols declared in (nested) structs or enums are * part of the next level (they are removed from the @@ -613,7 +613,7 @@ end_declaration_level(void) if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL) dcs->d_ldlsym = di->d_ldlsym; break; - case OLD_STYLE_ARG: + case DK_OLD_STYLE_ARG: /* * All symbols in dcs->d_dlsyms are introduced in old style * argument declarations (it's not clean, but possible). @@ -626,7 +626,7 @@ end_declaration_level(void) dcs->d_func_proto_syms = di->d_dlsyms; } break; - case ABSTRACT: + case DK_ABSTRACT: /* * casts and sizeof * Append all symbols declared in the abstract declaration @@ -638,15 +638,15 @@ end_declaration_level(void) if ((*dcs->d_ldlsym = di->d_dlsyms) != NULL) dcs->d_ldlsym = di->d_ldlsym; break; - case AUTO: + case DK_AUTO: /* check usage of local vars */ check_usage(di); /* FALLTHROUGH */ - case PROTO_ARG: + case DK_PROTO_ARG: /* usage of arguments will be checked by funcend() */ rmsyms(di->d_dlsyms); break; - case EXTERN: + case DK_EXTERN: /* there is nothing after external declarations */ /* FALLTHROUGH */ default: @@ -707,13 +707,14 @@ begin_type(void) static void dcs_adjust_storage_class(void) { - if (dcs->d_ctx == EXTERN) { + if (dcs->d_kind == DK_EXTERN) { if (dcs->d_scl == REG || dcs->d_scl == AUTO) { /* illegal storage class */ error(8); dcs->d_scl = NOSCL; } - } else if (dcs->d_ctx == OLD_STYLE_ARG || dcs->d_ctx == PROTO_ARG) { + } 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... */ error(9); @@ -1004,14 +1005,14 @@ check_type(sym_t *sym) #endif } } else if (to == NOTSPEC && t == VOID) { - if (dcs->d_ctx == PROTO_ARG) { + if (dcs->d_kind == DK_PROTO_ARG) { if (sym->s_scl != ABSTRACT) { lint_assert(sym->s_name != unnamed); /* void parameter cannot have ... */ error(61, sym->s_name); *tpp = gettyp(INT); } - } else if (dcs->d_ctx == ABSTRACT) { + } else if (dcs->d_kind == DK_ABSTRACT) { /* ok */ } else if (sym->s_scl != TYPEDEF) { /* void type for '%s' */ @@ -1160,7 +1161,7 @@ declarator_1_struct_union(sym_t *dsym) } } - if (dcs->d_ctx == MOU) { + if (dcs->d_kind == DK_MOU) { o = dcs->d_offset_in_bits; dcs->d_offset_in_bits = 0; } @@ -1176,7 +1177,7 @@ declarator_1_struct_union(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_ctx == MOU) { + if (dcs->d_kind == DK_MOU) { if (o > dcs->d_offset_in_bits) dcs->d_offset_in_bits = o; } @@ -1436,7 +1437,7 @@ add_function(sym_t *decl, sym_t *args) * because *dcs is the declaration stack element created for the list * of params and is removed after add_function.) */ - if (dcs->d_enclosing->d_ctx == EXTERN && + if (dcs->d_enclosing->d_kind == DK_EXTERN && decl->s_type == dcs->d_enclosing->d_type) { dcs->d_enclosing->d_func_proto_syms = dcs->d_dlsyms; dcs->d_enclosing->d_func_args = args; @@ -1513,7 +1514,7 @@ old_style_function(sym_t *decl, sym_t *a * Remember list of parameters only if this really seems to be a * function definition. */ - if (dcs->d_enclosing->d_ctx == EXTERN && + 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 @@ -1570,19 +1571,19 @@ declarator_name(sym_t *sym) sym = pushdown(sym); } - switch (dcs->d_ctx) { - case MOS: - case MOU: + switch (dcs->d_kind) { + case DK_MOS: + case DK_MOU: /* Set parent */ sym->u.s_member.sm_sou_type = dcs->d_tagtyp->t_str; sym->s_def = DEF; /* XXX: Where is sym->u.s_member.sm_offset_in_bits set? */ - sc = dcs->d_ctx; + sc = dcs->d_kind == DK_MOS ? MOS : MOU; break; - case EXTERN: + case DK_EXTERN: /* * static and external symbols without "extern" are - * considered to be tentative defined, external + * considered to be tentatively defined, external * symbols with "extern" are declared, and typedef names * are defined. Tentative defined and declared symbols * may become defined if an initializer is present or @@ -1600,10 +1601,10 @@ declarator_name(sym_t *sym) sym->s_def = DECL; } break; - case PROTO_ARG: + case DK_PROTO_ARG: sym->s_arg = true; /* FALLTHROUGH */ - case OLD_STYLE_ARG: + case DK_OLD_STYLE_ARG: if ((sc = dcs->d_scl) == NOSCL) { sc = AUTO; } else { @@ -1613,7 +1614,7 @@ declarator_name(sym_t *sym) } sym->s_def = DEF; break; - case AUTO: + case DK_AUTO: if ((sc = dcs->d_scl) == NOSCL) { /* * XXX somewhat ugly because we dont know whether @@ -1634,7 +1635,7 @@ declarator_name(sym_t *sym) sym->s_def = DECL; } break; - case ABSTRACT: /* try to continue after syntax errors */ + case DK_ABSTRACT: /* try to continue after syntax errors */ sc = NOSCL; break; default: @@ -2071,16 +2072,17 @@ void declare(sym_t *decl, bool initflg, sbuf_t *renaming) { - if (dcs->d_ctx == EXTERN) { + if (dcs->d_kind == DK_EXTERN) { declare_extern(decl, initflg, renaming); - } else if (dcs->d_ctx == OLD_STYLE_ARG || dcs->d_ctx == PROTO_ARG) { + } else if (dcs->d_kind == DK_OLD_STYLE_ARG || + dcs->d_kind == DK_PROTO_ARG) { if (renaming != NULL) { /* symbol renaming can't be used on function arguments */ error(310); } else (void)declare_argument(decl, initflg); } else { - lint_assert(dcs->d_ctx == AUTO); + lint_assert(dcs->d_kind == DK_AUTO); if (renaming != NULL) { /* symbol renaming can't be used on automatic variables */ error(311); @@ -2888,7 +2890,7 @@ check_init(sym_t *sym) erred = true; } else if (sym->s_scl == EXTERN && sym->s_def == DECL) { /* cannot initialize "extern" declaration: %s */ - if (dcs->d_ctx == EXTERN) { + if (dcs->d_kind == DK_EXTERN) { /* cannot initialize extern declaration: %s */ warning(26, sym->s_name); } else { @@ -2909,7 +2911,8 @@ abstract_name(void) { sym_t *sym; - lint_assert(dcs->d_ctx == ABSTRACT || dcs->d_ctx == PROTO_ARG); + lint_assert(dcs->d_kind == DK_ABSTRACT || + dcs->d_kind == DK_PROTO_ARG); sym = block_zero_alloc(sizeof(*sym)); @@ -2918,7 +2921,7 @@ abstract_name(void) sym->s_scl = ABSTRACT; sym->s_block_level = -1; - if (dcs->d_ctx == PROTO_ARG) + if (dcs->d_kind == DK_PROTO_ARG) sym->s_arg = true; /* @@ -3183,7 +3186,7 @@ check_tag_usage(sym_t *sym) return; /* always complain about incomplete tags declared inside blocks */ - if (!zflag || dcs->d_ctx != EXTERN) + if (!zflag || dcs->d_kind != DK_EXTERN) return; switch (sym->s_type->t_tspec) { @@ -3376,7 +3379,7 @@ to_int_constant(tnode_t *tn, bool requir * We don't free blocks that are inside casts because these * will be used later to match types. */ - if (tn->tn_op != CON && dcs->d_ctx != ABSTRACT) + if (tn->tn_op != CON && dcs->d_kind != DK_ABSTRACT) expr_free_all(); if ((t = v->v_tspec) == FLOAT || t == DOUBLE || t == LDOUBLE) { Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.153 src/usr.bin/xlint/lint1/externs1.h:1.154 --- src/usr.bin/xlint/lint1/externs1.h:1.153 Sat Apr 9 13:22:05 2022 +++ src/usr.bin/xlint/lint1/externs1.h Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.153 2022/04/09 13:22:05 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.154 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -115,6 +115,7 @@ extern void expr_restore_memory(struct m */ #ifdef DEBUG +const char *declaration_kind_name(declaration_kind); const char *scl_name(scl_t); const char *symt_name(symt_t); const char *tqual_name(tqual_t); @@ -186,7 +187,7 @@ extern void add_type(type_t *); extern void add_qualifier(tqual_t); extern void addpacked(void); extern void add_attr_used(void); -extern void begin_declaration_level(scl_t); +extern void begin_declaration_level(declaration_kind); extern void end_declaration_level(void); extern void setasm(void); extern void begin_type(void); Index: src/usr.bin/xlint/lint1/func.c diff -u src/usr.bin/xlint/lint1/func.c:1.131 src/usr.bin/xlint/lint1/func.c:1.132 --- src/usr.bin/xlint/lint1/func.c:1.131 Sat Apr 9 13:38:17 2022 +++ src/usr.bin/xlint/lint1/func.c Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: func.c,v 1.131 2022/04/09 13:38:17 rillig Exp $ */ +/* $NetBSD: func.c,v 1.132 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: func.c,v 1.131 2022/04/09 13:38:17 rillig Exp $"); +__RCSID("$NetBSD: func.c,v 1.132 2022/04/09 23:41:22 rillig Exp $"); #endif #include <stdlib.h> @@ -423,7 +423,7 @@ funcend(void) * the symbol table */ lint_assert(dcs->d_enclosing == NULL); - lint_assert(dcs->d_ctx == EXTERN); + lint_assert(dcs->d_kind == DK_EXTERN); rmsyms(dcs->d_func_proto_syms); /* must be set on level 0 */ @@ -1178,7 +1178,7 @@ argsused(int n) if (n == -1) n = 0; - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "ARGSUSED"); return; @@ -1204,7 +1204,7 @@ varargs(int n) if (n == -1) n = 0; - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "VARARGS"); return; @@ -1230,7 +1230,7 @@ printflike(int n) if (n == -1) n = 0; - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "PRINTFLIKE"); return; @@ -1256,7 +1256,7 @@ scanflike(int n) if (n == -1) n = 0; - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "SCANFLIKE"); return; @@ -1311,7 +1311,7 @@ void lintlib(int n) { - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "LINTLIBRARY"); return; @@ -1354,7 +1354,7 @@ void protolib(int n) { - if (dcs->d_ctx != EXTERN) { + if (dcs->d_kind != DK_EXTERN) { /* must be outside function: ** %s ** */ warning(280, "PROTOLIB"); return; Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.117 src/usr.bin/xlint/lint1/lex.c:1.118 --- src/usr.bin/xlint/lint1/lex.c:1.117 Sat Apr 9 15:43:41 2022 +++ src/usr.bin/xlint/lint1/lex.c Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.117 2022/04/09 15:43:41 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.118 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: lex.c,v 1.117 2022/04/09 15:43:41 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.118 2022/04/09 23:41:22 rillig Exp $"); #endif #include <ctype.h> @@ -1417,7 +1417,7 @@ getsym(sbuf_t *sb) while (di->d_enclosing != NULL && di->d_enclosing->d_enclosing != NULL) di = di->d_enclosing; - lint_assert(di->d_ctx == AUTO); + lint_assert(di->d_kind == DK_AUTO); } else { sym = block_zero_alloc(sizeof(*sym)); sym->s_name = sb->sb_name; Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.149 src/usr.bin/xlint/lint1/lint1.h:1.150 --- src/usr.bin/xlint/lint1/lint1.h:1.149 Sat Apr 9 21:19:52 2022 +++ src/usr.bin/xlint/lint1/lint1.h Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.149 2022/04/09 21:19:52 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.150 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -206,9 +206,6 @@ typedef enum { BOOL_CONST, ENUM_CONST, ABSTRACT, /* abstract symbol (sizeof, casts, unnamed argument) */ - OLD_STYLE_ARG, /* old-style function argument declarations */ - PROTO_ARG, /* used in declaration stack during prototype - declaration */ INLINE /* only used by the parser */ } scl_t; @@ -323,24 +320,26 @@ struct array_size { int dim; }; +typedef enum declaration_kind { + DK_EXTERN, /* global variable or function */ + DK_MOS, /* struct member */ + DK_MOU, /* union member */ + DK_ENUM_CONST, /* enum constant */ + DK_OLD_STYLE_ARG, /* argument in an old-style function + * definition */ + DK_PROTO_ARG, /* argument in a prototype function + * definition */ + DK_AUTO, /* local symbol */ + DK_ABSTRACT /* abstract declaration; type name */ +} 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. - * - * d_ctx describes the context of the current declaration. Its value is - * one of - * EXTERN global declarations - * MOS or MOU declarations of struct or union members - * CTCONST declarations of enums or boolean constants - * OLD_STYLE_ARG declaration of arguments in old-style function - * definitions - * PROTO_ARG declaration of arguments in function prototypes - * AUTO declaration of local symbols - * ABSTRACT abstract declarations (sizeof, casts) - * */ typedef struct dinfo { + declaration_kind d_kind; tspec_t d_abstract_type;/* VOID, BOOL, CHAR, INT or COMPLEX */ tspec_t d_complex_mod; /* FLOAT or DOUBLE */ tspec_t d_sign_mod; /* SIGNED or UNSIGN */ @@ -352,7 +351,6 @@ typedef struct dinfo { unsigned int d_offset_in_bits; /* offset of next structure member */ unsigned short d_sou_align_in_bits; /* alignment required for current * structure */ - scl_t d_ctx; /* context of declaration */ bool d_const:1; /* const in declaration specifiers */ bool d_volatile:1; /* volatile in declaration specifiers */ bool d_inline:1; /* inline in declaration specifiers */ Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.423 src/usr.bin/xlint/lint1/tree.c:1.424 --- src/usr.bin/xlint/lint1/tree.c:1.423 Sat Apr 9 16:02:14 2022 +++ src/usr.bin/xlint/lint1/tree.c Sat Apr 9 23:41:22 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.423 2022/04/09 16:02:14 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.424 2022/04/09 23:41:22 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: tree.c,v 1.423 2022/04/09 16:02:14 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.424 2022/04/09 23:41:22 rillig Exp $"); #endif #include <float.h> @@ -3902,7 +3902,7 @@ expr(tnode_t *tn, bool vctx, bool tctx, } /* expr() is also called in global initializations */ - if (dcs->d_ctx != EXTERN && !is_do_while) + if (dcs->d_kind != DK_EXTERN && !is_do_while) check_statement_reachable(); check_expr_misc(tn, vctx, tctx, !tctx, false, false, false);