Module Name: src Committed By: rillig Date: Sun Aug 28 12:04:48 UTC 2022
Modified Files: src/usr.bin/xlint/lint1: decl.c externs1.h init.c tree.c src/usr.bin/xlint/lint2: chk.c Log Message: lint: clean up visual clutter No functional change. To generate a diff of this commit: cvs rdiff -u -r1.297 -r1.298 src/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.167 -r1.168 src/usr.bin/xlint/lint1/externs1.h cvs rdiff -u -r1.236 -r1.237 src/usr.bin/xlint/lint1/init.c cvs rdiff -u -r1.478 -r1.479 src/usr.bin/xlint/lint1/tree.c cvs rdiff -u -r1.50 -r1.51 src/usr.bin/xlint/lint2/chk.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/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.297 src/usr.bin/xlint/lint1/decl.c:1.298 --- src/usr.bin/xlint/lint1/decl.c:1.297 Sun Aug 28 10:43:18 2022 +++ src/usr.bin/xlint/lint1/decl.c Sun Aug 28 12:04:47 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.297 2022/08/28 10:43:18 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.298 2022/08/28 12:04:47 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.297 2022/08/28 10:43:18 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.298 2022/08/28 12:04:47 rillig Exp $"); #endif #include <sys/param.h> @@ -66,7 +66,7 @@ static type_t *typedef_error(type_t *, t static void set_first_typedef(type_t *, sym_t *); static void dcs_align(unsigned int, unsigned int); static sym_t *new_tag(sym_t *, scl_t, bool, bool); -static bool eq_prototype_args(const type_t *, const type_t *, bool *); +static bool prototypes_compatible(const type_t *, const type_t *, bool *); static bool matches_no_arg_function(const type_t *, bool *); static bool check_old_style_definition(sym_t *, sym_t *); static bool check_prototype_declaration(sym_t *, sym_t *); @@ -190,8 +190,8 @@ expr_unqualified_type(const type_t *tp) * In case of a struct or union type, the members should lose their * qualifiers as well, but that would require a deep copy of the * struct or union type. This in turn would defeat the type - * comparison in eqtype, which simply tests whether tp1->t_str == - * tp2->t_str. + * comparison in types_compatible, which simply tests whether + * tp1->t_str == tp2->t_str. */ return ntp; @@ -206,15 +206,15 @@ is_incomplete(const type_t *tp) { tspec_t t; - if ((t = tp->t_tspec) == VOID) { + if ((t = tp->t_tspec) == VOID) return true; - } else if (t == ARRAY) { + if (t == ARRAY) return tp->t_incomplete_array; - } else if (is_struct_or_union(t)) { + if (is_struct_or_union(t)) return tp->t_str->sou_incomplete; - } else if (t == ENUM) { + if (t == ENUM) return tp->t_enum->en_incomplete; - } + return false; } @@ -233,16 +233,17 @@ dcs_add_storage_class(scl_t sc) dcs->d_inline = true; return; } + if (dcs->d_type != NULL || dcs->d_abstract_type != NOTSPEC || dcs->d_sign_mod != NOTSPEC || dcs->d_rank_mod != NOTSPEC) { /* storage class after type is obsolescent */ warning(83); } - if (dcs->d_scl == NOSCL) { + + if (dcs->d_scl == NOSCL) dcs->d_scl = sc; - } else { + else dcs->d_multiple_storage_classes = true; - } } /* @@ -419,31 +420,33 @@ typedef_error(type_t *td, tspec_t t) return td; } - if (t == LONG && - (t2 == INT || t2 == UINT || t2 == LONG || t2 == ULONG || - t2 == FLOAT || t2 == DOUBLE || t2 == DCOMPLEX)) { - /* modifying typedef with '%s'; only qualifiers allowed */ - warning(5, "long"); - if (t2 == INT) { - td = gettyp(LONG); - } else if (t2 == UINT) { - td = gettyp(ULONG); - } else if (t2 == LONG) { - td = gettyp(QUAD); - } else if (t2 == ULONG) { - td = gettyp(UQUAD); - } else if (t2 == FLOAT) { - td = gettyp(DOUBLE); - } else if (t2 == DOUBLE) { - td = gettyp(LDOUBLE); - } else if (t2 == DCOMPLEX) { - td = gettyp(LCOMPLEX); - } - td = block_dup_type(td); - td->t_typedef = true; - return td; - } + if (t != LONG) + goto invalid; + + if (t2 == INT) + td = gettyp(LONG); + else if (t2 == UINT) + td = gettyp(ULONG); + else if (t2 == LONG) + td = gettyp(QUAD); + else if (t2 == ULONG) + td = gettyp(UQUAD); + else if (t2 == FLOAT) + td = gettyp(DOUBLE); + else if (t2 == DOUBLE) + td = gettyp(LDOUBLE); + else if (t2 == DCOMPLEX) + td = gettyp(LCOMPLEX); + else + goto invalid; + + /* modifying typedef with '%s'; only qualifiers allowed */ + warning(5, "long"); + td = block_dup_type(td); + td->t_typedef = true; + return td; +invalid: /* Anything else is not accepted. */ dcs->d_invalid_type_combination = true; return td; @@ -463,7 +466,7 @@ set_first_typedef(type_t *tp, sym_t *sym { tspec_t t; - if ((t = tp->t_tspec) == STRUCT || t == UNION) { + if (is_struct_or_union(t = tp->t_tspec)) { if (tp->t_str->sou_first_typedef == NULL) tp->t_str->sou_first_typedef = sym; } else if (t == ENUM) { @@ -619,9 +622,8 @@ end_declaration_level(void) dcs->d_func_proto_syms = di->d_dlsyms; } break; - case DK_ABSTRACT: + case DK_ABSTRACT: /* casts and sizeof */ /* - * casts and sizeof * Append all symbols declared in the abstract declaration * to the list of symbols declared in the surrounding * declaration or block. @@ -668,9 +670,8 @@ end_declaration_level(void) void dcs_set_asm(void) { - dinfo_t *di; - for (di = dcs; di != NULL; di = di->d_enclosing) + for (dinfo_t *di = dcs; di != NULL; di = di->d_enclosing) di->d_asm = true; } @@ -786,10 +787,9 @@ dcs_merge_declaration_specifiers(void) } /* - * 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 structure from the information gathered in the declaration + * stack. + * Complain about storage classes which are not possible in current context. */ void dcs_end_type(void) @@ -894,15 +894,15 @@ 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)) { + if (is_struct_or_union(t = tp->t_tspec)) a = tp->t_str->sou_align_in_bits; - } else { + else { lint_assert(t != FUNC); - if ((a = size_in_bits(t)) == 0) { + if ((a = size_in_bits(t)) == 0) a = CHAR_SIZE; - } else if (a > worst_align_in_bits) { + else if (a > worst_align_in_bits) a = worst_align_in_bits; - } + } lint_assert(a >= CHAR_SIZE); lint_assert(a <= worst_align_in_bits); @@ -960,14 +960,11 @@ check_type(sym_t *sym) if (t == FUNC || t == ARRAY) { /* function returns illegal type '%s' */ error(15, type_name(tp)); - if (t == FUNC) { - *tpp = block_derive_type(*tpp, PTR); - } else { - *tpp = block_derive_type( - (*tpp)->t_subt, PTR); - } + *tpp = block_derive_type( + t == FUNC ? *tpp : (*tpp)->t_subt, PTR); return; - } else if (tp->t_const || tp->t_volatile) { + } + if (tp->t_const || tp->t_volatile) { /* TODO: Make this a warning in C99 mode as well. */ if (!allow_trad && !allow_c99) { /* XXX or better allow_c90? */ /* function cannot return const... */ @@ -980,27 +977,21 @@ check_type(sym_t *sym) error(16); *tpp = gettyp(INT); return; - } else if (t == ARRAY && tp->t_dim == 0) { + } + if (t == ARRAY && tp->t_dim == 0) { /* null dimension */ error(17); return; - } else if (t == VOID) { + } + if (t == VOID) { /* illegal use of 'void' */ error(18); *tpp = gettyp(INT); -#if 0 /* errors are produced by length_in_bits */ - } else if (is_incomplete(tp)) { - /* array of incomplete type */ - /* TODO: Make this an error in C99 mode as well. */ - if (!allow_trad && !allow_c99) { - /* array of incomplete type */ - error(301); - } else { - /* array of incomplete type */ - warning(301); - } -#endif } + /* + * No need to check for incomplete types here as + * length_in_bits already does this. + */ } else if (to == NOTSPEC && t == VOID) { if (dcs->d_kind == DK_PROTO_ARG) { if (sym->s_scl != ABSTRACT) { @@ -1139,9 +1130,9 @@ declarator_1_struct_union(sym_t *dsym) t = (tp = dsym->s_type)->t_tspec; - if (dsym->s_bitfield) { + if (dsym->s_bitfield) declare_bit_field(dsym, &t, &tp); - } else if (t == FUNC) { + else if (t == FUNC) { /* function illegal in structure or union */ error(38); dsym->s_type = tp = block_derive_type(tp, t = PTR); @@ -1175,10 +1166,8 @@ 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_kind == DK_MOU) { - if (o > dcs->d_offset_in_bits) - dcs->d_offset_in_bits = o; - } + if (dcs->d_kind == DK_MOU && o > dcs->d_offset_in_bits) + dcs->d_offset_in_bits = o; check_function_definition(dsym, false); @@ -1299,12 +1288,10 @@ block_derive_pointer(type_t *stp, bool i sym_t * add_pointer(sym_t *decl, qual_ptr *p) { - type_t **tpp; - qual_ptr *next; debug_dinfo(dcs); - tpp = &decl->s_type; + type_t **tpp = &decl->s_type; while (*tpp != NULL && *tpp != dcs->d_type) tpp = &(*tpp)->t_subt; if (*tpp == NULL) { @@ -1319,7 +1306,7 @@ add_pointer(sym_t *decl, qual_ptr *p) tpp = &(*tpp)->t_subt; - next = p->p_next; + qual_ptr *next = p->p_next; free(p); p = next; } @@ -1330,9 +1317,8 @@ add_pointer(sym_t *decl, qual_ptr *p) static type_t * block_derive_array(type_t *stp, bool dim, int len) { - type_t *tp; - tp = block_derive_type(stp, ARRAY); + type_t *tp = block_derive_type(stp, ARRAY); tp->t_dim = len; #if 0 @@ -1340,8 +1326,9 @@ block_derive_array(type_t *stp, bool dim * 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. Once created, a type - * should not be modified anymore. + * 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. @@ -1371,11 +1358,10 @@ block_derive_array(type_t *stp, bool dim sym_t * add_array(sym_t *decl, bool dim, int n) { - type_t **tpp; debug_dinfo(dcs); - tpp = &decl->s_type; + type_t **tpp = &decl->s_type; while (*tpp != NULL && *tpp != dcs->d_type) tpp = &(*tpp)->t_subt; if (*tpp == NULL) { @@ -1393,9 +1379,8 @@ add_array(sym_t *decl, bool dim, int n) static type_t * block_derive_function(type_t *ret, bool proto, sym_t *args, bool vararg) { - type_t *tp; - tp = block_derive_type(ret, FUNC); + type_t *tp = block_derive_type(ret, FUNC); tp->t_proto = proto; if (proto) tp->t_args = args; @@ -1406,7 +1391,6 @@ block_derive_function(type_t *ret, bool sym_t * add_function(sym_t *decl, sym_t *args) { - type_t **tpp; debug_enter(); debug_dinfo(dcs); @@ -1445,7 +1429,7 @@ add_function(sym_t *decl, sym_t *args) * XXX: What is this code doing on a semantic level, and why? * Returning decl leads to the wrong function types in msg_347. */ - tpp = &decl->s_type; + type_t **tpp = &decl->s_type; if (*tpp == NULL) decl->s_type = dcs->d_enclosing->d_type; while (*tpp != NULL && *tpp != dcs->d_enclosing->d_type) @@ -1559,9 +1543,9 @@ declarator_name(sym_t *sym) { scl_t sc = NOSCL; - if (sym->s_scl == NOSCL) { + if (sym->s_scl == NOSCL) dcs->d_redeclared_symbol = NULL; - } else if (sym->s_defarg) { + else if (sym->s_defarg) { sym->s_defarg = false; dcs->d_redeclared_symbol = NULL; } else { @@ -1590,11 +1574,11 @@ declarator_name(sym_t *sym) if ((sc = dcs->d_scl) == NOSCL) { sc = EXTERN; sym->s_def = TDEF; - } else if (sc == STATIC) { + } else if (sc == STATIC) sym->s_def = TDEF; - } else if (sc == TYPEDEF) { + else if (sc == TYPEDEF) sym->s_def = DEF; - } else { + else { lint_assert(sc == EXTERN); sym->s_def = DECL; } @@ -1603,9 +1587,9 @@ declarator_name(sym_t *sym) sym->s_arg = true; /* FALLTHROUGH */ case DK_OLD_STYLE_ARG: - if ((sc = dcs->d_scl) == NOSCL) { + if ((sc = dcs->d_scl) == NOSCL) sc = AUTO; - } else { + else { lint_assert(sc == REG); sym->s_register = true; sc = AUTO; @@ -1622,9 +1606,9 @@ declarator_name(sym_t *sym) */ sc = AUTO; sym->s_def = DEF; - } else if (sc == AUTO || sc == STATIC || sc == TYPEDEF) { + } else if (sc == AUTO || sc == STATIC || sc == TYPEDEF) sym->s_def = DEF; - } else if (sc == REG) { + else if (sc == REG) { sym->s_register = true; sc = AUTO; sym->s_def = DEF; @@ -1686,24 +1670,25 @@ make_tag_type(sym_t *tag, tspec_t kind, scl_t scl; type_t *tp; - if (kind == STRUCT) { + if (kind == STRUCT) scl = STRUCT_TAG; - } else if (kind == UNION) { + else if (kind == UNION) scl = UNION_TAG; - } else { + else { lint_assert(kind == ENUM); scl = ENUM_TAG; } if (tag != NULL) { - if (tag->s_scl != NOSCL) { + if (tag->s_scl != NOSCL) tag = new_tag(tag, scl, decl, semi); - } else { + else { /* a new tag, no empty declaration */ dcs->d_enclosing->d_nonempty_decl = true; if (scl == ENUM_TAG && !decl) { /* TODO: Make this an error in C99 mode as well. */ - if (allow_c90 && ((!allow_trad && !allow_c99) || pflag)) + if (allow_c90 && + ((!allow_trad && !allow_c99) || pflag)) /* forward reference to enum type */ warning(42); } @@ -1712,9 +1697,9 @@ make_tag_type(sym_t *tag, tspec_t kind, tag->s_scl = scl; tag->s_type = tp = block_zero_alloc(sizeof(*tp)); tp->t_packed = dcs->d_packed; - } else { + } else tp = tag->s_type; - } + } else { tag = block_zero_alloc(sizeof(*tag)); tag->s_name = unnamed; @@ -1798,9 +1783,8 @@ new_tag(sym_t *tag, scl_t scl, bool decl print_previous_declaration(-1, tag); tag = pushdown(tag); dcs->d_enclosing->d_nonempty_decl = true; - } else if (semi || decl) { + } else if (semi || decl) dcs->d_enclosing->d_nonempty_decl = true; - } } return tag; } @@ -1828,10 +1812,6 @@ storage_class_name(scl_t sc) type_t * complete_tag_struct_or_union(type_t *tp, sym_t *fmem) { - tspec_t t; - struct_or_union *sp; - int n; - sym_t *mem; if (tp == NULL) /* in case of syntax errors */ return gettyp(INT); @@ -1841,9 +1821,10 @@ complete_tag_struct_or_union(type_t *tp, else tp->t_str->sou_incomplete = false; - t = tp->t_tspec; + tspec_t t = tp->t_tspec; dcs_align((u_int)dcs->d_sou_align_in_bits, 0); - sp = tp->t_str; + + struct_or_union *sp = tp->t_str; sp->sou_align_in_bits = dcs->d_sou_align_in_bits; sp->sou_first_member = fmem; if (tp->t_packed) @@ -1856,8 +1837,8 @@ complete_tag_struct_or_union(type_t *tp, c99ism(47, ttab[t].tt_name); } - n = 0; - for (mem = fmem; mem != NULL; mem = mem->s_next) { + int n = 0; + for (sym_t *mem = fmem; mem != NULL; mem = mem->s_next) { /* bind anonymous members to the structure */ if (mem->u.s_member.sm_sou_type == NULL) { mem->u.s_member.sm_sou_type = sp; @@ -1924,13 +1905,16 @@ enumeration_constant(sym_t *sym, int val } sym = pushdown(sym); } + sym->s_scl = ENUM_CONST; sym->s_type = dcs->d_tagtyp; sym->u.s_enum_constant = val; + if (impl && val == TARG_INT_MIN) { /* enumeration value '%s' overflows */ warning(48, sym->s_name); } + enumval = val == TARG_INT_MAX ? TARG_INT_MIN : val + 1; return sym; } @@ -1941,14 +1925,11 @@ enumeration_constant(sym_t *sym, int val static void declare_extern(sym_t *dsym, bool initflg, sbuf_t *renaming) { - bool dowarn, rval, redec; - sym_t *rdsym; - char *s; if (renaming != NULL) { lint_assert(dsym->s_rename == NULL); - s = level_zero_alloc(1, renaming->sb_len + 1); + char *s = level_zero_alloc(1, renaming->sb_len + 1); (void)memcpy(s, renaming->sb_name, renaming->sb_len + 1); dsym->s_rename = s; } @@ -1984,12 +1965,13 @@ declare_extern(sym_t *dsym, bool initflg * With both LINTLIBRARY and PROTOLIB the prototype is * written as a function definition to the output file. */ - rval = dsym->s_type->t_subt->t_tspec != VOID; + bool rval = dsym->s_type->t_subt->t_tspec != VOID; outfdef(dsym, &dsym->s_def_pos, rval, false, NULL); } else if (!is_compiler_builtin(dsym->s_name)) { outsym(dsym, dsym->s_scl, dsym->s_def); } + sym_t *rdsym; if ((rdsym = dcs->d_redeclared_symbol) != NULL) { /* @@ -1998,15 +1980,11 @@ declare_extern(sym_t *dsym, bool initflg * rdsym->s_old_style_args and compare them with the params * of the prototype. */ - if (rdsym->s_osdef && dsym->s_type->t_proto) { - redec = check_old_style_definition(rdsym, dsym); - } else { - redec = false; - } - - if (!redec && - !check_redeclaration(dsym, (dowarn = false, &dowarn))) { + bool redec = rdsym->s_osdef && dsym->s_type->t_proto && + check_old_style_definition(rdsym, dsym); + bool dowarn = false; + if (!redec && !check_redeclaration(dsym, &dowarn)) { if (dowarn) { /* TODO: Make this an error in C99 mode as well. */ if (!allow_trad && !allow_c99) @@ -2029,22 +2007,11 @@ declare_extern(sym_t *dsym, bool initflg dsym->s_def_pos = rdsym->s_def_pos; } - /* - * Remember the position of the declaration if the - * old symbol was a prototype and the new is not. - * Also remember the position if the old symbol - * was defined and the new is not. - */ - if (rdsym->s_type->t_proto && !dsym->s_type->t_proto) { + if (rdsym->s_type->t_proto && !dsym->s_type->t_proto) dsym->s_def_pos = rdsym->s_def_pos; - } else if (rdsym->s_def == DEF && dsym->s_def != DEF) { + else if (rdsym->s_def == DEF && dsym->s_def != DEF) dsym->s_def_pos = rdsym->s_def_pos; - } - /* - * Copy usage information of the name into the new - * symbol. - */ copy_usage_info(dsym, rdsym); /* Once a name is defined, it remains defined. */ @@ -2056,7 +2023,6 @@ declare_extern(sym_t *dsym, bool initflg dsym->s_inline = true; complete_type(dsym, rdsym); - } rmsym(rdsym); @@ -2067,17 +2033,16 @@ declare_extern(sym_t *dsym, bool initflg dsym->s_type->t_typedef = true; set_first_typedef(dsym->s_type, dsym); } - } void declare(sym_t *decl, bool initflg, sbuf_t *renaming) { - if (dcs->d_kind == DK_EXTERN) { + if (dcs->d_kind == DK_EXTERN) declare_extern(decl, initflg, renaming); - } else if (dcs->d_kind == DK_OLD_STYLE_ARG || - dcs->d_kind == DK_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); @@ -2109,15 +2074,14 @@ copy_usage_info(sym_t *sym, sym_t *rdsym /* * Prints an error and returns true if a symbol is redeclared/redefined. - * Otherwise returns false and, in some cases of minor problems, prints + * Otherwise, returns false and, in some cases of minor problems, prints * a warning. */ bool check_redeclaration(sym_t *dsym, bool *dowarn) { - sym_t *rsym; - rsym = dcs->d_redeclared_symbol; + sym_t *rsym = dcs->d_redeclared_symbol; if (rsym->s_scl == ENUM_CONST) { /* redeclaration of '%s' */ error(27, dsym->s_name); @@ -2142,7 +2106,7 @@ check_redeclaration(sym_t *dsym, bool *d print_previous_declaration(-1, rsym); return true; } - if (!eqtype(rsym->s_type, dsym->s_type, false, false, dowarn)) { + if (!types_compatible(rsym->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(rsym->s_type)); @@ -2188,56 +2152,46 @@ check_redeclaration(sym_t *dsym, bool *d static bool qualifiers_correspond(const type_t *tp1, const type_t *tp2, bool ignqual) { + if (tp1->t_const != tp2->t_const && !ignqual && allow_c90) return false; - if (tp1->t_volatile != tp2->t_volatile && !ignqual && allow_c90) return false; - return true; } bool -eq_pointer_type(const type_t *tp1, const type_t *tp2, bool ignqual) +pointer_types_are_compatible(const type_t *tp1, const type_t *tp2, bool ignqual) { - if (tp1->t_tspec != VOID && tp2->t_tspec != VOID) - return false; - - if (!qualifiers_correspond(tp1, tp2, ignqual)) - return false; - return true; + return tp1->t_tspec == VOID || tp2->t_tspec == VOID || + qualifiers_correspond(tp1, tp2, ignqual); } - /* - * Checks if two types are compatible. - * - * ignqual ignore qualifiers of type; used for function params - * promot promote left type; used for comparison of params of - * old style function definitions with params of prototypes. - * *dowarn set to true if an old style function declaration is not + * ignqual ignore qualifiers of type; 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 * compatible with a prototype */ bool -eqtype(const type_t *tp1, const type_t *tp2, - bool ignqual, bool promot, bool *dowarn) +types_compatible(const type_t *tp1, const type_t *tp2, + bool ignqual, bool promot, bool *dowarn) { - tspec_t t; while (tp1 != NULL && tp2 != NULL) { - - t = tp1->t_tspec; + tspec_t t = tp1->t_tspec; if (promot) { - if (t == FLOAT) { + if (t == FLOAT) t = DOUBLE; - } else if (t == CHAR || t == SCHAR) { + else if (t == CHAR || t == SCHAR) t = INT; - } else if (t == UCHAR) { + else if (t == UCHAR) t = allow_c90 ? INT : UINT; - } else if (t == SHORT) { + else if (t == SHORT) t = INT; - } else if (t == USHORT) { + else if (t == USHORT) { /* CONSTCOND */ t = TARG_INT_MAX < TARG_USHRT_MAX || !allow_c90 ? UINT : INT; @@ -2264,7 +2218,7 @@ eqtype(const type_t *tp1, const type_t * /* don't check prototypes for traditional */ if (t == FUNC && allow_c90) { if (tp1->t_proto && tp2->t_proto) { - if (!eq_prototype_args(tp1, tp2, dowarn)) + if (!prototypes_compatible(tp1, tp2, dowarn)) return false; } else if (tp1->t_proto) { if (!matches_no_arg_function(tp1, dowarn)) @@ -2278,36 +2232,26 @@ eqtype(const type_t *tp1, const type_t * tp1 = tp1->t_subt; tp2 = tp2->t_subt; ignqual = promot = false; - } return tp1 == tp2; } -/* - * Compares the parameter types of two prototypes. - */ static bool -eq_prototype_args(const type_t *tp1, const type_t *tp2, bool *dowarn) +prototypes_compatible(const type_t *tp1, const type_t *tp2, bool *dowarn) { - sym_t *a1, *a2; if (tp1->t_vararg != tp2->t_vararg) return false; - a1 = tp1->t_args; - a2 = tp2->t_args; - - while (a1 != NULL && a2 != NULL) { + sym_t *a1 = tp1->t_args; + sym_t *a2 = tp2->t_args; - if (!eqtype(a1->s_type, a2->s_type, true, false, dowarn)) + for (; a1 != NULL && a2 != NULL; a1 = a1->s_next, a2 = a2->s_next) { + if (!types_compatible(a1->s_type, a2->s_type, + true, false, dowarn)) return false; - - a1 = a1->s_next; - a2 = a2->s_next; - } - return a1 == a2; } @@ -2327,10 +2271,8 @@ matches_no_arg_function(const type_t *tp sym_t *arg; tspec_t t; - if (tp->t_vararg) { - if (dowarn != NULL) - *dowarn = true; - } + 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 || t == CHAR || t == SCHAR || t == UCHAR || @@ -2339,6 +2281,7 @@ matches_no_arg_function(const type_t *tp *dowarn = true; } } + /* FIXME: Always returning true cannot be correct. */ return true; } @@ -2381,7 +2324,8 @@ check_old_style_definition(sym_t *rdsym, * * XXX: Where is this "only a warning"? */ - if (!eqtype(arg->s_type, parg->s_type, true, true, &dowarn) || + if (!types_compatible(arg->s_type, parg->s_type, + true, true, &dowarn) || dowarn) { /* prototype does not match old style ... */ error(299, n); @@ -2413,8 +2357,8 @@ end: void complete_type(sym_t *dsym, sym_t *ssym) { - type_t **dstp, *src; - type_t *dst; + type_t **dstp, *src; + type_t *dst; dstp = &dsym->s_type; src = ssym->s_type; @@ -2446,7 +2390,7 @@ complete_type(sym_t *dsym, sym_t *ssym) sym_t * declare_argument(sym_t *sym, bool initflg) { - tspec_t t; + tspec_t t; check_function_definition(sym, true); @@ -2474,9 +2418,9 @@ declare_argument(sym_t *sym, bool initfl if (sym->s_type == NULL) /* for c(void()) */ sym->s_type = gettyp(VOID); - if ((t = sym->s_type->t_tspec) == ARRAY) { + if ((t = sym->s_type->t_tspec) == ARRAY) sym->s_type = block_derive_type(sym->s_type->t_subt, PTR); - } else if (t == FUNC) { + else if (t == FUNC) { if (!allow_c90) /* argument '%s' has function type, should be ... */ warning(50, sym->s_name); @@ -2504,12 +2448,19 @@ declare_argument(sym_t *sym, bool initfl return sym; } +static bool +is_character_pointer(const type_t *tp) +{ + tspec_t st; + + return tp->t_tspec == PTR && + (st = tp->t_subt->t_tspec, + st == CHAR || st == SCHAR || st == UCHAR); +} + void check_func_lint_directives(void) { - sym_t *arg; - int narg, n; - tspec_t t; /* check for illegal combinations of lint directives */ if (printflike_argnum != -1 && scanflike_argnum != -1) { @@ -2529,8 +2480,8 @@ check_func_lint_directives(void) * check if the argument of a lint directive is compatible with the * number of arguments. */ - narg = 0; - for (arg = dcs->d_func_args; arg != NULL; arg = arg->s_next) + int narg = 0; + for (sym_t *arg = dcs->d_func_args; arg != NULL; arg = arg->s_next) narg++; if (nargusg > narg) { /* argument number mismatch with directive ** %s ** */ @@ -2559,12 +2510,10 @@ check_func_lint_directives(void) if (printflike_argnum != -1 || scanflike_argnum != -1) { narg = printflike_argnum != -1 ? printflike_argnum : scanflike_argnum; - arg = dcs->d_func_args; - for (n = 1; n < narg; n++) + sym_t *arg = dcs->d_func_args; + for (int n = 1; n < narg; n++) arg = arg->s_next; - if (arg->s_type->t_tspec != PTR || - ((t = arg->s_type->t_subt->t_tspec) != CHAR && - t != UCHAR && t != SCHAR)) { + if (!is_character_pointer(arg->s_type)) { /* argument %d must be 'char *' for PRINTFLIKE/... */ warning(293, narg); printflike_argnum = scanflike_argnum = -1; @@ -2628,10 +2577,11 @@ check_func_old_style_arguments(void) arg = arg->s_next; } } - if (msg) + if (msg) { /* prototype declaration */ print_previous_declaration(285, dcs->d_redeclared_symbol); + } /* from now on the prototype is valid */ funcsym->s_osdef = false; @@ -2655,8 +2605,8 @@ check_prototype_declaration(sym_t *arg, dowarn = false; - if (!eqtype(tp, ptp, true, true, &dowarn)) { - if (eqtype(tp, ptp, true, false, &dowarn)) { + if (!types_compatible(tp, ptp, true, true, &dowarn)) { + if (types_compatible(tp, ptp, true, false, &dowarn)) { /* type of '%s' does not match prototype */ return gnuism(58, arg->s_name); } else { @@ -2664,7 +2614,8 @@ check_prototype_declaration(sym_t *arg, error(58, arg->s_name); return true; } - } else if (dowarn) { + } + if (dowarn) { /* TODO: Make this an error in C99 mode as well. */ if (!allow_trad && !allow_c99) /* type of '%s' does not match prototype */ @@ -2718,17 +2669,19 @@ check_local_redeclaration(const sym_t *d * is produced below */ if (!allow_c90) { - if (hflag) + if (hflag) { /* declaration of '%s' hides ... */ warning(91, dsym->s_name); + } rmsym(rsym); } } } else if (rsym->s_block_level < block_level) { - if (hflag) + if (hflag) { /* declaration of '%s' hides earlier one */ warning(95, dsym->s_name); + } } if (rsym->s_block_level == block_level) { @@ -2772,9 +2725,9 @@ declare_local(sym_t *dsym, bool initflg) * also be the way gcc behaves. */ if (dcs->d_inline) { - if (dsym->s_type->t_tspec == FUNC) { + if (dsym->s_type->t_tspec == FUNC) dsym->s_inline = true; - } else { + else { /* variable '%s' declared inline */ warning(268, dsym->s_name); } @@ -2792,11 +2745,11 @@ declare_local(sym_t *dsym, bool initflg) * XXX if the static variable at level 0 is only defined * later, checking will be possible. */ - if (dsym->s_ext_sym == NULL) { + if (dsym->s_ext_sym == NULL) outsym(dsym, EXTERN, dsym->s_def); - } else { + else outsym(dsym, dsym->s_ext_sym->s_scl, dsym->s_def); - } + } if (dcs->d_redeclared_symbol != NULL) @@ -2814,22 +2767,18 @@ declare_local(sym_t *dsym, bool initflg) } /* - * Before we can check the size we must wait for a initialization - * which may follow. + * Before we can check the size we must wait for an initialization + * that may follow. */ } -/* - * Processes (re)declarations of external symbols inside blocks. - */ +/* Processes (re)declarations of external symbols inside blocks. */ static void declare_external_in_block(sym_t *dsym) { - bool eqt, dowarn; - sym_t *esym; /* look for a symbol with the same name */ - esym = dcs->d_redeclared_symbol; + sym_t *esym = dcs->d_redeclared_symbol; while (esym != NULL && esym->s_block_level != 0) { while ((esym = esym->s_symtab_next) != NULL) { if (esym->s_kind != FVFT) @@ -2848,10 +2797,11 @@ declare_external_in_block(sym_t *dsym) return; } - dowarn = false; - eqt = eqtype(esym->s_type, dsym->s_type, false, false, &dowarn); + bool dowarn = false; + bool compatible = types_compatible(esym->s_type, dsym->s_type, + false, false, &dowarn); - if (!eqt || dowarn) { + if (!compatible || dowarn) { if (esym->s_scl == EXTERN) { /* inconsistent redeclaration of extern '%s' */ warning(90, dsym->s_name); @@ -2863,7 +2813,7 @@ declare_external_in_block(sym_t *dsym) } } - if (eqt) { + if (compatible) { /* * Remember the external symbol so we can update usage * information at the end of the block. @@ -2983,15 +2933,12 @@ void check_size(sym_t *dsym) { - if (dsym->s_def != DEF) - return; - if (dsym->s_scl == TYPEDEF) - return; - if (dsym->s_type->t_tspec == FUNC) - return; - - if (length_in_bits(dsym->s_type, dsym->s_name) == 0 && - dsym->s_type->t_tspec == ARRAY && dsym->s_type->t_dim == 0) { + if (dsym->s_def == DEF && + dsym->s_scl != TYPEDEF && + dsym->s_type->t_tspec != FUNC && + 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) { /* empty array declaration for '%s' */ warning(190, dsym->s_name); @@ -3044,15 +2991,12 @@ mark_as_used(sym_t *sym, bool fcall, boo void check_usage(dinfo_t *di) { - sym_t *sym; - int saved_lwarn; - /* for this warning LINTED has no effect */ - saved_lwarn = lwarn; + int saved_lwarn = lwarn; lwarn = LWARN_ALL; debug_step("begin lwarn %d", lwarn); - for (sym = di->d_dlsyms; sym != NULL; sym = sym->s_level_next) + for (sym_t *sym = di->d_dlsyms; sym != NULL; sym = sym->s_level_next) check_usage_sym(di->d_asm, sym); lwarn = saved_lwarn; debug_step("end lwarn %d", lwarn); @@ -3114,10 +3058,9 @@ check_variable_usage(bool novar, sym_t * * XXX Only variables are checked, although types should * probably also be checked */ - if ((sc = sym->s_scl) != EXTERN && sc != STATIC && - sc != AUTO && sc != REG) { + sc = sym->s_scl; + if (sc != EXTERN && sc != STATIC && sc != AUTO && sc != REG) return; - } if (novar) return; @@ -3231,13 +3174,12 @@ check_global_symbols(void) for (sym = dcs->d_dlsyms; sym != NULL; sym = sym->s_level_next) { if (sym->s_block_level == -1) continue; - if (sym->s_kind == FVFT) { + if (sym->s_kind == FVFT) check_global_variable(sym); - } else if (sym->s_kind == FTAG) { + else if (sym->s_kind == FTAG) check_tag_usage(sym); - } else { + else lint_assert(sym->s_kind == FMEMBER); - } } } @@ -3306,15 +3248,14 @@ check_global_variable_size(const sym_t * if (sym->s_def != TDEF) return; - if (sym->s_type->t_tspec == FUNC) - /* - * this can happen if a syntax error occurred after a - * function declaration - */ + if (sym->s_type->t_tspec == FUNC) { + /* Maybe a syntax error after a function declaration. */ + return; + } + if (sym->s_def == TDEF && sym->s_type->t_tspec == VOID) { + /* Prevent an internal error in length_in_bits below. */ return; - if (sym->s_def == TDEF && sym->s_type->t_tspec == VOID) - return; /* prevent internal error in length_in_bits - * below */ + } cpos = curr_pos; curr_pos = sym->s_def_pos; @@ -3346,6 +3287,7 @@ print_previous_declaration(int msg, cons return; if (msg != -1) { + /* TODO: inline these cases. */ (message_at)(msg, &psym->s_def_pos); } else if (psym->s_def == DEF || psym->s_def == TDEF) { /* previous definition of '%s' */ @@ -3371,12 +3313,11 @@ to_int_constant(tnode_t *tn, bool requir { int i; tspec_t t; - val_t *v; if (tn == NULL) return 1; - v = constant(tn, required); + val_t *v = constant(tn, required); /* * Abstract declarations are used inside expression. To free Index: src/usr.bin/xlint/lint1/externs1.h diff -u src/usr.bin/xlint/lint1/externs1.h:1.167 src/usr.bin/xlint/lint1/externs1.h:1.168 --- src/usr.bin/xlint/lint1/externs1.h:1.167 Sun Aug 28 10:43:18 2022 +++ src/usr.bin/xlint/lint1/externs1.h Sun Aug 28 12:04:47 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: externs1.h,v 1.167 2022/08/28 10:43:18 rillig Exp $ */ +/* $NetBSD: externs1.h,v 1.168 2022/08/28 12:04:47 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -220,8 +220,10 @@ extern sym_t *enumeration_constant(sym_t extern void declare(sym_t *, bool, sbuf_t *); extern void copy_usage_info(sym_t *, sym_t *); extern bool check_redeclaration(sym_t *, bool *); -extern bool eq_pointer_type(const type_t *, const type_t *, bool); -extern bool eqtype(const type_t *, const type_t *, bool, bool, bool *); +extern bool pointer_types_are_compatible(const type_t *, const type_t *, + bool); +extern bool types_compatible(const type_t *, const type_t *, + bool, bool, bool *); extern void complete_type(sym_t *, sym_t *); extern sym_t *declare_argument(sym_t *, bool); extern void check_func_lint_directives(void); Index: src/usr.bin/xlint/lint1/init.c diff -u src/usr.bin/xlint/lint1/init.c:1.236 src/usr.bin/xlint/lint1/init.c:1.237 --- src/usr.bin/xlint/lint1/init.c:1.236 Wed Jun 22 19:23:17 2022 +++ src/usr.bin/xlint/lint1/init.c Sun Aug 28 12:04:47 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: init.c,v 1.236 2022/06/22 19:23:17 rillig Exp $ */ +/* $NetBSD: init.c,v 1.237 2022/08/28 12:04:47 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.236 2022/06/22 19:23:17 rillig Exp $"); +__RCSID("$NetBSD: init.c,v 1.237 2022/08/28 12:04:47 rillig Exp $"); #endif #include <stdlib.h> @@ -674,7 +674,7 @@ again: return false; ltp = brace_level_sub_type(bl); - if (eqtype(ltp, rn->tn_type, true, false, NULL)) + if (types_compatible(ltp, rn->tn_type, true, false, NULL)) return true; if (is_struct_or_union(ltp->t_tspec) || ltp->t_tspec == ARRAY) { Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.478 src/usr.bin/xlint/lint1/tree.c:1.479 --- src/usr.bin/xlint/lint1/tree.c:1.478 Sun Aug 28 10:43:18 2022 +++ src/usr.bin/xlint/lint1/tree.c Sun Aug 28 12:04:47 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.478 2022/08/28 10:43:18 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.479 2022/08/28 12:04:47 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.478 2022/08/28 10:43:18 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.479 2022/08/28 12:04:47 rillig Exp $"); #endif #include <float.h> @@ -642,7 +642,7 @@ struct_or_union_member(tnode_t *tn, op_t break; } w = false; - eq = eqtype(csym->s_type, sym->s_type, + eq = types_compatible(csym->s_type, sym->s_type, false, false, &w) && !w; if (!eq) break; @@ -727,7 +727,8 @@ build_generic_selection(const tnode_t *e for (; sel != NULL; sel = sel->ga_prev) { if (expr != NULL && - eqtype(sel->ga_arg, expr->tn_type, false, false, NULL)) + types_compatible(sel->ga_arg, expr->tn_type, + false, false, NULL)) return sel->ga_result; else if (sel->ga_arg == NULL) default_result = sel->ga_result; @@ -1145,7 +1146,8 @@ typeok_minus(op_t op, return false; } if (lt == PTR && rt == PTR) { - if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) { + if (!types_compatible(ltp->t_subt, rtp->t_subt, + true, false, NULL)) { /* illegal pointer subtraction */ error(116); } @@ -1311,9 +1313,9 @@ typeok_colon_pointer(const mod_t *mp, co return; } - if (eq_pointer_type(lstp, rstp, true)) + if (pointer_types_are_compatible(lstp, rstp, true)) return; - if (!eqtype(lstp, rstp, true, false, NULL)) + if (!types_compatible(lstp, rstp, true, false, NULL)) warn_incompatible_pointers(mp, ltp, rtp); } @@ -1589,7 +1591,7 @@ check_pointer_comparison(op_t op, const return; } - if (!eqtype(ltp->t_subt, rtp->t_subt, true, false, NULL)) { + if (!types_compatible(ltp->t_subt, rtp->t_subt, true, false, NULL)) { warn_incompatible_pointers(&modtab[op], ltp, rtp); return; } @@ -1757,7 +1759,8 @@ check_assign_void_pointer_compat(op_t op const type_t *const rstp, tspec_t const rst) { if (!(lt == PTR && rt == PTR && (lst == VOID || rst == VOID || - eqtype(lstp, rstp, true, false, NULL)))) + types_compatible(lstp, rstp, + true, false, NULL)))) return false; /* compatible pointer types (qualifiers ignored) */ @@ -2564,8 +2567,8 @@ struct_starts_with(const type_t *struct_ { return struct_tp->t_str->sou_first_member != NULL && - eqtype(struct_tp->t_str->sou_first_member->s_type, member_tp, - true, false, NULL); + types_compatible(struct_tp->t_str->sou_first_member->s_type, + member_tp, true, false, NULL); } static bool @@ -2606,7 +2609,8 @@ should_warn_about_pointer_cast(const typ const sym_t *nmem = nstp->t_str->sou_first_member; const sym_t *omem = ostp->t_str->sou_first_member; while (nmem != NULL && omem != NULL && - eqtype(nmem->s_type, omem->s_type, true, false, NULL)) + types_compatible(nmem->s_type, omem->s_type, + true, false, NULL)) nmem = nmem->s_next, omem = omem->s_next; if (nmem != NULL && is_byte_array(nmem->s_type)) return false; @@ -3384,7 +3388,8 @@ is_cast_redundant(const tnode_t *tn) if (ntp->t_subt->t_tspec == VOID || otp->t_subt->t_tspec == VOID || - eqtype(ntp->t_subt, otp->t_subt, false, false, NULL)) + types_compatible(ntp->t_subt, otp->t_subt, + false, false, NULL)) return true; } @@ -3449,7 +3454,7 @@ build_assignment(op_t op, bool sys, tnod } if (any_query_enabled && rn->tn_op == CVT && rn->tn_cast && - eqtype(ln->tn_type, rn->tn_type, false, false, NULL) && + types_compatible(ln->tn_type, rn->tn_type, false, false, NULL) && is_cast_redundant(rn)) { /* redundant cast from '%s' to '%s' before assignment */ query_message(7, @@ -3979,7 +3984,7 @@ cast(tnode_t *tn, type_t *tp) return NULL; } for (m = str->sou_first_member; m != NULL; m = m->s_next) { - if (eqtype(m->s_type, tn->tn_type, + if (types_compatible(m->s_type, tn->tn_type, false, false, NULL)) { tn = expr_alloc_tnode(); tn->tn_op = CVT; @@ -4017,9 +4022,11 @@ cast(tnode_t *tn, type_t *tp) } else goto invalid_cast; - if (any_query_enabled && eqtype(tp, tn->tn_type, false, false, NULL)) + if (any_query_enabled && types_compatible(tp, tn->tn_type, + false, false, NULL)) { /* no-op cast from '%s' to '%s' */ query_message(6, type_name(tn->tn_type), type_name(tp)); + } tn = convert(CVT, 0, tp, tn); tn->tn_cast = true; @@ -4189,7 +4196,7 @@ check_prototype_argument( ln->tn_type = expr_unqualified_type(tp); ln->tn_lvalue = true; if (typeok(FARG, n, ln, tn)) { - if (!eqtype(tp, tn->tn_type, + if (!types_compatible(tp, tn->tn_type, true, false, (dowarn = false, &dowarn)) || dowarn) tn = convert(FARG, n, tp, tn); } Index: src/usr.bin/xlint/lint2/chk.c diff -u src/usr.bin/xlint/lint2/chk.c:1.50 src/usr.bin/xlint/lint2/chk.c:1.51 --- src/usr.bin/xlint/lint2/chk.c:1.50 Sun Aug 28 10:43:19 2022 +++ src/usr.bin/xlint/lint2/chk.c Sun Aug 28 12:04:47 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: chk.c,v 1.50 2022/08/28 10:43:19 rillig Exp $ */ +/* $NetBSD: chk.c,v 1.51 2022/08/28 12:04:47 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: chk.c,v 1.50 2022/08/28 10:43:19 rillig Exp $"); +__RCSID("$NetBSD: chk.c,v 1.51 2022/08/28 12:04:47 rillig Exp $"); #endif #include <ctype.h> @@ -65,8 +65,8 @@ static void badfmt(const hte_t *, fcall_ static void inconarg(const hte_t *, fcall_t *, int); static void tofewarg(const hte_t *, fcall_t *); static void tomanyarg(const hte_t *, fcall_t *); -static bool eqtype(type_t *, type_t *, bool, bool, bool, bool *); -static bool eq_prototype_args(type_t *, type_t *, bool *); +static bool types_compatible(type_t *, type_t *, bool, bool, bool, bool *); +static bool prototypes_compatible(type_t *, type_t *, bool *); static bool matches_no_arg_function(type_t *, bool *); @@ -253,7 +253,7 @@ chkvtui(const hte_t *hte, sym_t *def, sy t1 = (tp1 = TP(def->s_type)->t_subt)->t_tspec; for (call = hte->h_calls; call != NULL; call = call->f_next) { tp2 = TP(call->f_type)->t_subt; - eq = eqtype(tp1, tp2, + eq = types_compatible(tp1, tp2, true, false, false, (dowarn = false, &dowarn)); if (!call->f_rused) { /* no return value used */ @@ -316,10 +316,10 @@ chkvtdi(const hte_t *hte, sym_t *def, sy tp2 = TP(sym->s_type); dowarn = false; if (tp1->t_tspec == FUNC && tp2->t_tspec == FUNC) { - eq = eqtype(xt1 = tp1->t_subt, xt2 = tp2->t_subt, - true, false, false, &dowarn); + eq = types_compatible(xt1 = tp1->t_subt, + xt2 = tp2->t_subt, true, false, false, &dowarn); } else { - eq = eqtype(xt1 = tp1, xt2 = tp2, + eq = types_compatible(xt1 = tp1, xt2 = tp2, false, false, false, &dowarn); } if (!eq || (sflag && dowarn)) { @@ -478,7 +478,7 @@ chkau(const hte_t *hte, int n, sym_t *de asgn = def != NULL || (decl != NULL && TP(decl->s_type)->t_proto); dowarn = false; - if (eqtype(arg1, arg2, true, promote, asgn, &dowarn) && + if (types_compatible(arg1, arg2, true, promote, asgn, &dowarn) && (!sflag || !dowarn)) return; @@ -1160,7 +1160,7 @@ chkadecl(const hte_t *hte, sym_t *def, s while (*ap1 != NULL && *ap2 != NULL) { type_t *xt1, *xt2; dowarn = false; - eq = eqtype(xt1 = *ap1, xt2 = *ap2, + eq = types_compatible(xt1 = *ap1, xt2 = *ap2, true, osdef, false, &dowarn); if (!eq || dowarn) { pos1 = xstrdup(mkpos(&sym1->s_pos)); @@ -1207,8 +1207,8 @@ chkadecl(const hte_t *hte, sym_t *def, s * an incompatible prototype declaration */ static bool -eqtype(type_t *tp1, type_t *tp2, bool ignqual, bool promot, bool asgn, - bool *dowarn) +types_compatible(type_t *tp1, type_t *tp2, + bool ignqual, bool promot, bool asgn, bool *dowarn) { tspec_t t, to; int indir; @@ -1308,7 +1308,7 @@ eqtype(type_t *tp1, type_t *tp2, bool ig if (t == FUNC) { if (tp1->t_proto && tp2->t_proto) { - if (!eq_prototype_args(tp1, tp2, dowarn)) + if (!prototypes_compatible(tp1, tp2, dowarn)) return false; } else if (tp1->t_proto) { if (!matches_no_arg_function(tp1, dowarn)) @@ -1334,7 +1334,7 @@ eqtype(type_t *tp1, type_t *tp2, bool ig * Compares arguments of two prototypes */ static bool -eq_prototype_args(type_t *tp1, type_t *tp2, bool *dowarn) +prototypes_compatible(type_t *tp1, type_t *tp2, bool *dowarn) { type_t **a1, **a2; @@ -1346,7 +1346,7 @@ eq_prototype_args(type_t *tp1, type_t *t while (*a1 != NULL && *a2 != NULL) { - if (!eqtype(*a1, *a2, true, false, false, dowarn)) + if (!types_compatible(*a1, *a2, true, false, false, dowarn)) return false; a1++;