Module Name: src
Committed By: rillig
Date: Fri Jan 15 23:43:51 UTC 2021
Modified Files:
src/usr.bin/xlint/lint1: func.c lint1.h tree.c
Log Message:
lint: merge duplicate code for non-zero detection
To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.53 -r1.54 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.152 -r1.153 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/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.57 src/usr.bin/xlint/lint1/func.c:1.58
--- src/usr.bin/xlint/lint1/func.c:1.57 Tue Jan 12 20:42:01 2021
+++ src/usr.bin/xlint/lint1/func.c Fri Jan 15 23:43:51 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.57 2021/01/12 20:42:01 rillig Exp $ */
+/* $NetBSD: func.c,v 1.58 2021/01/15 23:43:51 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.57 2021/01/12 20:42:01 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.58 2021/01/15 23:43:51 rillig Exp $");
#endif
#include <stdlib.h>
@@ -725,13 +725,8 @@ while1(tnode_t *tn)
pushctrl(T_WHILE);
cstmt->c_loop = 1;
- if (tn != NULL && tn->tn_op == CON) {
- if (is_integer(tn->tn_type->t_tspec)) {
- cstmt->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstmt->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
- }
+ if (tn != NULL && tn->tn_op == CON)
+ cstmt->c_infinite = is_nonzero(tn);
expr(tn, 0, 1, 1);
}
@@ -790,11 +785,7 @@ do2(tnode_t *tn)
tn = check_controlling_expression(tn);
if (tn != NULL && tn->tn_op == CON) {
- if (is_integer(tn->tn_type->t_tspec)) {
- cstmt->c_infinite = tn->tn_val->v_quad != 0;
- } else {
- cstmt->c_infinite = tn->tn_val->v_ldbl != 0.0;
- }
+ cstmt->c_infinite = is_nonzero(tn);
if (!cstmt->c_infinite && cstmt->c_cont)
/* continue in 'do ... while (0)' loop */
error(323);
@@ -850,15 +841,8 @@ for1(tnode_t *tn1, tnode_t *tn2, tnode_t
if (tn2 != NULL)
expr(tn2, 0, 1, 1);
- if (tn2 == NULL) {
- cstmt->c_infinite = 1;
- } else if (tn2->tn_op == CON) {
- if (is_integer(tn2->tn_type->t_tspec)) {
- cstmt->c_infinite = tn2->tn_val->v_quad != 0;
- } else {
- cstmt->c_infinite = tn2->tn_val->v_ldbl != 0.0;
- }
- }
+ cstmt->c_infinite =
+ tn2 == NULL || (tn2->tn_op == CON && is_nonzero(tn2));
/* Checking the reinitialisation expression is done in for2() */
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.53 src/usr.bin/xlint/lint1/lint1.h:1.54
--- src/usr.bin/xlint/lint1/lint1.h:1.53 Mon Jan 4 22:26:50 2021
+++ src/usr.bin/xlint/lint1/lint1.h Fri Jan 15 23:43:51 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.53 2021/01/04 22:26:50 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.54 2021/01/15 23:43:51 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -459,3 +459,20 @@ check_printf(const char *fmt, ...)
# define gnuism(id, args...) wrap_check_printf(gnuism, id, ##args)
# define c99ism(id, args...) wrap_check_printf(c99ism, id, ##args)
#endif
+
+static inline bool
+is_nonzero_val(tspec_t t, const val_t *val)
+{
+ return is_floating(t) ? val->v_ldbl != 0.0 : val->v_quad != 0;
+}
+
+static inline bool
+is_nonzero(const tnode_t *tn)
+{
+ /*
+ * XXX: It's strange that val_t doesn't know itself whether it
+ * holds a floating-point or an integer value.
+ */
+ lint_assert(tn->tn_op == CON);
+ return is_nonzero_val(tn->tn_type->t_tspec, tn->tn_val);
+}
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.152 src/usr.bin/xlint/lint1/tree.c:1.153
--- src/usr.bin/xlint/lint1/tree.c:1.152 Thu Jan 14 07:42:31 2021
+++ src/usr.bin/xlint/lint1/tree.c Fri Jan 15 23:43:51 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.152 2021/01/14 07:42:31 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.153 2021/01/15 23:43:51 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.152 2021/01/14 07:42:31 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.153 2021/01/15 23:43:51 rillig Exp $");
#endif
#include <float.h>
@@ -2234,9 +2234,7 @@ convert_constant(op_t op, int arg, type_
if (nt == BOOL) { /* C99 6.3.1.2 */
nv->v_ansiu = 0;
- nv->v_quad = ot == FLOAT || ot == DOUBLE || ot == LDOUBLE
- ? v->v_ldbl != 0.0
- : v->v_quad != 0;
+ nv->v_quad = is_nonzero_val(ot, v) ? 1 : 0;
return;
}
@@ -3142,26 +3140,15 @@ fold(tnode_t *tn)
static tnode_t *
fold_test(tnode_t *tn)
{
- int l, r = 0;
+ bool l, r;
val_t *v;
v = xcalloc(1, sizeof (val_t));
v->v_tspec = tn->tn_type->t_tspec;
lint_assert(v->v_tspec == INT || (Tflag && v->v_tspec == BOOL));
- if (is_floating(tn->tn_left->tn_type->t_tspec)) {
- l = tn->tn_left->tn_val->v_ldbl != 0.0;
- } else {
- l = tn->tn_left->tn_val->v_quad != 0;
- }
-
- if (modtab[tn->tn_op].m_binary) {
- if (is_floating(tn->tn_right->tn_type->t_tspec)) {
- r = tn->tn_right->tn_val->v_ldbl != 0.0;
- } else {
- r = tn->tn_right->tn_val->v_quad != 0;
- }
- }
+ l = is_nonzero(tn->tn_left);
+ r = modtab[tn->tn_op].m_binary && is_nonzero(tn->tn_right);
switch (tn->tn_op) {
case NOT: