Module Name: src
Committed By: rillig
Date: Mon Jul 10 19:47:12 UTC 2023
Modified Files:
src/usr.bin/xlint/lint1: cgram.y ckbool.c debug.c lint1.h tree.c
Log Message:
lint: merge duplicate code for getting the name of an operator
To generate a diff of this commit:
cvs rdiff -u -r1.450 -r1.451 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.24 -r1.25 src/usr.bin/xlint/lint1/ckbool.c
cvs rdiff -u -r1.48 -r1.49 src/usr.bin/xlint/lint1/debug.c
cvs rdiff -u -r1.183 -r1.184 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.559 -r1.560 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.450 src/usr.bin/xlint/lint1/cgram.y:1.451
--- src/usr.bin/xlint/lint1/cgram.y:1.450 Mon Jul 10 19:04:52 2023
+++ src/usr.bin/xlint/lint1/cgram.y Mon Jul 10 19:47:12 2023
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.450 2023/07/10 19:04:52 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.451 2023/07/10 19:47:12 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.450 2023/07/10 19:04:52 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.451 2023/07/10 19:47:12 rillig Exp $");
#endif
#include <limits.h>
@@ -2223,7 +2223,7 @@ cgram_to_string(int token, YYSTYPE val)
case T_RELATIONAL:
case T_EQUALITY:
case T_OPASSIGN:
- return modtab[val.y_op].m_name;
+ return op_name(val.y_op);
case T_SCLASS:
return scl_name(val.y_scl);
case T_TYPE:
Index: src/usr.bin/xlint/lint1/ckbool.c
diff -u src/usr.bin/xlint/lint1/ckbool.c:1.24 src/usr.bin/xlint/lint1/ckbool.c:1.25
--- src/usr.bin/xlint/lint1/ckbool.c:1.24 Sun Jul 9 10:42:07 2023
+++ src/usr.bin/xlint/lint1/ckbool.c Mon Jul 10 19:47:12 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: ckbool.c,v 1.24 2023/07/09 10:42:07 rillig Exp $ */
+/* $NetBSD: ckbool.c,v 1.25 2023/07/10 19:47:12 rillig Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: ckbool.c,v 1.24 2023/07/09 10:42:07 rillig Exp $");
+__RCSID("$NetBSD: ckbool.c,v 1.25 2023/07/10 19:47:12 rillig Exp $");
#endif
#include <string.h>
@@ -50,12 +50,6 @@ __RCSID("$NetBSD: ckbool.c,v 1.24 2023/0
*/
-static const char *
-op_name(op_t op)
-{
- return modtab[op].m_name;
-}
-
/*
* See if in strict bool mode, the operator takes either two bool operands
* or two arbitrary other operands.
Index: src/usr.bin/xlint/lint1/debug.c
diff -u src/usr.bin/xlint/lint1/debug.c:1.48 src/usr.bin/xlint/lint1/debug.c:1.49
--- src/usr.bin/xlint/lint1/debug.c:1.48 Mon Jul 10 16:20:52 2023
+++ src/usr.bin/xlint/lint1/debug.c Mon Jul 10 19:47:12 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.48 2023/07/10 16:20:52 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.49 2023/07/10 19:47:12 rillig Exp $ */
/*-
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: debug.c,v 1.48 2023/07/10 16:20:52 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.49 2023/07/10 19:47:12 rillig Exp $");
#endif
#include <stdlib.h>
@@ -166,7 +166,7 @@ debug_node(const tnode_t *tn) // NOLINT(
op = tn->tn_op;
debug_print_indent();
debug_printf("'%s'",
- op == CVT && !tn->tn_cast ? "convert" : modtab[op].m_name);
+ op == CVT && !tn->tn_cast ? "convert" : op_name(op));
if (op == NAME)
debug_printf(" '%s' with %s",
tn->tn_sym->s_name,
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.183 src/usr.bin/xlint/lint1/lint1.h:1.184
--- src/usr.bin/xlint/lint1/lint1.h:1.183 Mon Jul 10 19:00:33 2023
+++ src/usr.bin/xlint/lint1/lint1.h Mon Jul 10 19:47:12 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.183 2023/07/10 19:00:33 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.184 2023/07/10 19:47:12 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -551,6 +551,12 @@ is_nonzero(const tnode_t *tn)
return tn != NULL && tn->tn_op == CON && is_nonzero_val(&tn->tn_val);
}
+static inline const char *
+op_name(op_t op)
+{
+ return modtab[op].m_name;
+}
+
static inline bool
is_binary(const tnode_t *tn)
{
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.559 src/usr.bin/xlint/lint1/tree.c:1.560
--- src/usr.bin/xlint/lint1/tree.c:1.559 Mon Jul 10 09:51:30 2023
+++ src/usr.bin/xlint/lint1/tree.c Mon Jul 10 19:47:12 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.559 2023/07/10 09:51:30 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.560 2023/07/10 19:47:12 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.559 2023/07/10 09:51:30 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.560 2023/07/10 19:47:12 rillig Exp $");
#endif
#include <float.h>
@@ -82,12 +82,6 @@ str_ends_with(const char *haystack, cons
memcmp(haystack + hlen - nlen, needle, nlen) == 0;
}
-static const char *
-op_name(op_t op)
-{
- return modtab[op].m_name;
-}
-
static unsigned
width_in_bits(const type_t *tp)
{
@@ -1703,13 +1697,13 @@ build_binary(tnode_t *ln, op_t op, bool
if (mp->m_warn_if_left_unsigned_in_c90 &&
ln->tn_op == CON && ln->tn_val.v_unsigned_since_c90) {
/* ANSI C treats constant as unsigned, op '%s' */
- warning(218, mp->m_name);
+ warning(218, op_name(op));
ln->tn_val.v_unsigned_since_c90 = false;
}
if (mp->m_warn_if_right_unsigned_in_c90 &&
rn->tn_op == CON && rn->tn_val.v_unsigned_since_c90) {
/* ANSI C treats constant as unsigned, op '%s' */
- warning(218, mp->m_name);
+ warning(218, op_name(op));
rn->tn_val.v_unsigned_since_c90 = false;
}
@@ -2159,8 +2153,7 @@ typeok_incdec(op_t op, const tnode_t *tn
}
static bool
-typeok_address(const mod_t *mp,
- const tnode_t *tn, const type_t *tp, tspec_t t)
+typeok_address(op_t op, const tnode_t *tn, const type_t *tp, tspec_t t)
{
if (t == ARRAY || t == FUNC) {
/* ok, a warning comes later (in build_address()) */
@@ -2171,7 +2164,7 @@ typeok_address(const mod_t *mp,
error(163);
}
/* %soperand of '%s' must be lvalue */
- error(114, "", mp->m_name);
+ error(114, "", op_name(op));
return false;
} else if (is_scalar(t)) {
if (tp->t_bitfield) {
@@ -2181,7 +2174,7 @@ typeok_address(const mod_t *mp,
}
} else if (t != STRUCT && t != UNION) {
/* unacceptable operand of '%s' */
- error(111, mp->m_name);
+ error(111, op_name(op));
return false;
}
if (tn->tn_op == NAME && tn->tn_sym->s_register) {
@@ -2209,21 +2202,21 @@ warn_incompatible_types(op_t op,
const type_t *ltp, tspec_t lt,
const type_t *rtp, tspec_t rt)
{
- const mod_t *mp = &modtab[op];
+ bool binary = modtab[op].m_binary;
- if (lt == VOID || (mp->m_binary && rt == VOID)) {
+ if (lt == VOID || (binary && rt == VOID)) {
/* void type illegal in expression */
error(109);
} else if (op == ASSIGN) {
/* cannot assign to '%s' from '%s' */
error(171, type_name(ltp), type_name(rtp));
- } else if (mp->m_binary) {
+ } else if (binary) {
/* operands of '%s' have incompatible types '%s' and '%s' */
- error(107, mp->m_name, type_name(ltp), type_name(rtp));
+ error(107, op_name(op), type_name(ltp), type_name(rtp));
} else {
lint_assert(rt == NO_TSPEC);
/* operand of '%s' has invalid type '%s' */
- error(108, mp->m_name, type_name(ltp));
+ error(108, op_name(op), type_name(ltp));
}
}
@@ -2260,7 +2253,7 @@ typeok_minus(op_t op,
}
static void
-typeok_shr(const mod_t *mp,
+typeok_shr(op_t op,
const tnode_t *ln, tspec_t lt,
const tnode_t *rn, tspec_t rt)
{
@@ -2279,17 +2272,17 @@ typeok_shr(const mod_t *mp,
*/
if (ln->tn_op != CON) {
/* bitwise '%s' on signed value possibly nonportable */
- warning(117, mp->m_name);
+ warning(117, op_name(op));
} else if (ln->tn_val.u.integer < 0) {
/* bitwise '%s' on signed value nonportable */
- warning(120, mp->m_name);
+ warning(120, op_name(op));
}
} else if (allow_trad && allow_c90 &&
!is_uinteger(olt) && is_uinteger(ort)) {
/* The left operand would become unsigned in traditional C. */
if (hflag && (ln->tn_op != CON || ln->tn_val.u.integer < 0)) {
/* semantics of '%s' change in ANSI C; use ... */
- warning(118, mp->m_name);
+ warning(118, op_name(op));
}
} else if (allow_trad && allow_c90 &&
!is_uinteger(olt) && !is_uinteger(ort) &&
@@ -2300,13 +2293,13 @@ typeok_shr(const mod_t *mp,
*/
if (hflag && (ln->tn_op != CON || ln->tn_val.u.integer < 0)) {
/* semantics of '%s' change in ANSI C; use ... */
- warning(118, mp->m_name);
+ warning(118, op_name(op));
}
}
}
static void
-typeok_shl(const mod_t *mp, tspec_t lt, tspec_t rt)
+typeok_shl(op_t op, tspec_t lt, tspec_t rt)
{
/*
* C90 does not perform balancing for shift operations,
@@ -2324,7 +2317,7 @@ typeok_shl(const mod_t *mp, tspec_t lt,
*/
if (hflag && allow_trad && allow_c90)
/* semantics of '%s' change in ANSI C; use ... */
- warning(118, mp->m_name);
+ warning(118, op_name(op));
}
}
@@ -2363,8 +2356,7 @@ is_typeok_eq(const tnode_t *ln, tspec_t
* Print an appropriate warning.
*/
static void
-warn_incompatible_pointers(const mod_t *mp,
- const type_t *ltp, const type_t *rtp)
+warn_incompatible_pointers(op_t op, const type_t *ltp, const type_t *rtp)
{
lint_assert(ltp->t_tspec == PTR);
lint_assert(rtp->t_tspec == PTR);
@@ -2373,21 +2365,22 @@ warn_incompatible_pointers(const mod_t *
tspec_t rt = rtp->t_subt->t_tspec;
if (is_struct_or_union(lt) && is_struct_or_union(rt)) {
- if (mp == NULL) {
+ if (op == RETURN) {
/* illegal structure pointer combination */
warning(244);
} else {
/* incompatible structure pointers: '%s' '%s' '%s' */
- warning(245, type_name(ltp), mp->m_name, type_name(rtp));
+ warning(245, type_name(ltp),
+ op_name(op), type_name(rtp));
}
} else {
- if (mp == NULL) {
+ if (op == RETURN) {
/* illegal combination of '%s' and '%s' */
warning(184, type_name(ltp), type_name(rtp));
} else {
/* illegal combination of '%s' and '%s', op '%s' */
warning(124,
- type_name(ltp), type_name(rtp), mp->m_name);
+ type_name(ltp), type_name(rtp), op_name(op));
}
}
}
@@ -2413,7 +2406,7 @@ check_pointer_comparison(op_t op, const
}
if (!types_compatible(ltp->t_subt, rtp->t_subt, true, false, NULL)) {
- warn_incompatible_pointers(&modtab[op], ltp, rtp);
+ warn_incompatible_pointers(op, ltp, rtp);
return;
}
@@ -2463,7 +2456,7 @@ typeok_quest(tspec_t lt, const tnode_t *
}
static void
-typeok_colon_pointer(const mod_t *mp, const type_t *ltp, const type_t *rtp)
+typeok_colon_pointer(const type_t *ltp, const type_t *rtp)
{
type_t *lstp = ltp->t_subt;
type_t *rstp = rtp->t_subt;
@@ -2476,19 +2469,18 @@ typeok_colon_pointer(const mod_t *mp, co
if (!allow_trad && !allow_c99)
/* ANSI C forbids conversion of %s to %s, op %s */
warning(305, "function pointer", "'void *'",
- mp->m_name);
+ op_name(COLON));
return;
}
if (pointer_types_are_compatible(lstp, rstp, true))
return;
if (!types_compatible(lstp, rstp, true, false, NULL))
- warn_incompatible_pointers(mp, ltp, rtp);
+ warn_incompatible_pointers(COLON, ltp, rtp);
}
static bool
-typeok_colon(const mod_t *mp,
- const tnode_t *ln, const type_t *ltp, tspec_t lt,
+typeok_colon(const tnode_t *ln, const type_t *ltp, tspec_t lt,
const tnode_t *rn, const type_t *rtp, tspec_t rt)
{
@@ -2512,7 +2504,7 @@ typeok_colon(const mod_t *mp,
const char *rx = rt == PTR ? "pointer" : "integer";
/* illegal combination of %s '%s' and %s '%s', op '%s' */
warning(123, lx, type_name(ltp),
- rx, type_name(rtp), mp->m_name);
+ rx, type_name(rtp), op_name(COLON));
return true;
}
@@ -2524,7 +2516,7 @@ typeok_colon(const mod_t *mp,
}
if (lt == PTR && rt == PTR) {
- typeok_colon_pointer(mp, ltp, rtp);
+ typeok_colon_pointer(ltp, rtp);
return true;
}
@@ -2833,18 +2825,11 @@ check_assign_pointer(op_t op, int arg,
if (!(lt == PTR && rt == PTR))
return false;
- switch (op) {
- case RETURN:
- warn_incompatible_pointers(NULL, ltp, rtp);
- break;
- case FARG:
+ if (op == FARG)
/* converting '%s' to incompatible '%s' for ... */
warning(153, type_name(rtp), type_name(ltp), arg);
- break;
- default:
- warn_incompatible_pointers(&modtab[op], ltp, rtp);
- break;
- }
+ else
+ warn_incompatible_pointers(op, ltp, rtp);
return true;
}
@@ -2996,7 +2981,7 @@ check_null_effect(const tnode_t *tn)
* the operator, such as being integer, floating or scalar.
*/
static bool
-typeok_op(op_t op, const mod_t *mp, int arg,
+typeok_op(op_t op, int arg,
const tnode_t *ln, const type_t *ltp, tspec_t lt,
const tnode_t *rn, const type_t *rtp, tspec_t rt)
{
@@ -3013,16 +2998,16 @@ typeok_op(op_t op, const mod_t *mp, int
case INDIR:
return typeok_indir(ltp, lt);
case ADDR:
- return typeok_address(mp, ln, ltp, lt);
+ return typeok_address(op, ln, ltp, lt);
case PLUS:
return typeok_plus(op, ltp, lt, rtp, rt);
case MINUS:
return typeok_minus(op, ltp, lt, rtp, rt);
case SHL:
- typeok_shl(mp, lt, rt);
+ typeok_shl(op, lt, rt);
goto shift;
case SHR:
- typeok_shr(mp, ln, lt, rn, rt);
+ typeok_shr(op, ln, lt, rn, rt);
shift:
typeok_shift(ltp, lt, rn, rt);
break;
@@ -3040,7 +3025,7 @@ typeok_op(op_t op, const mod_t *mp, int
case QUEST:
return typeok_quest(lt, rn);
case COLON:
- return typeok_colon(mp, ln, ltp, lt, rn, rtp, rt);
+ return typeok_colon(ln, ltp, lt, rn, rtp, rt);
case ASSIGN:
case INIT:
case FARG:
@@ -3065,7 +3050,7 @@ typeok_op(op_t op, const mod_t *mp, int
if (pflag && !is_uinteger(lt) &&
!(!allow_c90 && is_uinteger(rt))) {
/* bitwise '%s' on signed value possibly nonportable */
- warning(117, mp->m_name);
+ warning(117, op_name(op));
}
goto assign;
case ANDASS:
@@ -3128,13 +3113,13 @@ check_enum_type_mismatch(op_t op, int ar
break;
default:
/* enum type mismatch: '%s' '%s' '%s' */
- warning(130, type_name(ln->tn_type), mp->m_name,
+ warning(130, type_name(ln->tn_type), op_name(op),
type_name(rn->tn_type));
break;
}
} else if (Pflag && eflag && mp->m_comparison && op != EQ && op != NE)
/* operator '%s' assumes that '%s' is ordered */
- warning(243, mp->m_name, type_name(ln->tn_type));
+ warning(243, op_name(op), type_name(ln->tn_type));
}
/* Prints a warning if the operands mix between enum and integer. */
@@ -3211,7 +3196,7 @@ typeok(op_t op, int arg, const tnode_t *
if (!typeok_scalar(op, mp, ltp, lt, rtp, rt))
return false;
- if (!typeok_op(op, mp, arg, ln, ltp, lt, rn, rtp, rt))
+ if (!typeok_op(op, arg, ln, ltp, lt, rn, rtp, rt))
return false;
typeok_enum(op, mp, arg, ln, ltp, rn, rtp);