Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/xlint/lint1 lint: split usual arithmetic conversions...



details:   https://anonhg.NetBSD.org/src/rev/a760f97864a8
branches:  trunk
changeset: 373260:a760f97864a8
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sat Jan 28 00:39:49 2023 +0000

description:
lint: split usual arithmetic conversions into separate functions

No functional change.

diffstat:

 usr.bin/xlint/lint1/tree.c |  145 +++++++++++++++++++++++---------------------
 1 files changed, 76 insertions(+), 69 deletions(-)

diffs (174 lines):

diff -r 74ac177d6555 -r a760f97864a8 usr.bin/xlint/lint1/tree.c
--- a/usr.bin/xlint/lint1/tree.c        Sat Jan 28 00:24:05 2023 +0000
+++ b/usr.bin/xlint/lint1/tree.c        Sat Jan 28 00:39:49 2023 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: tree.c,v 1.496 2023/01/28 00:24:05 rillig Exp $        */
+/*     $NetBSD: tree.c,v 1.497 2023/01/28 00:39:49 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.496 2023/01/28 00:24:05 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.497 2023/01/28 00:39:49 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -2181,81 +2181,88 @@
        return convert(op, 0, ntp, tn);
 }
 
+static const tspec_t arith_rank[] = {
+       LDOUBLE, DOUBLE, FLOAT,
+#ifdef INT128_SIZE
+       UINT128, INT128,
+#endif
+       UQUAD, QUAD,
+       ULONG, LONG,
+       UINT, INT,
+};
+
+/* Keep unsigned in traditional C */
+static tspec_t
+usual_arithmetic_conversion_trad(tspec_t lt, tspec_t rt)
+{
+
+       bool u = is_uinteger(lt) || is_uinteger(rt);
+       size_t i;
+       for (i = 0; arith_rank[i] != INT; i++)
+               if (lt == arith_rank[i] || rt == arith_rank[i])
+                       break;
+
+       tspec_t t = arith_rank[i];
+       if (u && is_integer(t) && !is_uinteger(t))
+               return unsigned_type(t);
+       return t;
+}
+
+static tspec_t
+usual_arithmetic_conversion_c90(tspec_t lt, tspec_t rt)
+{
+
+       if (lt == rt)
+               return lt;
+
+       if (lt == LCOMPLEX || rt == LCOMPLEX)
+               return LCOMPLEX;
+       if (lt == DCOMPLEX || rt == DCOMPLEX)
+               return DCOMPLEX;
+       if (lt == FCOMPLEX || rt == FCOMPLEX)
+               return FCOMPLEX;
+       if (lt == LDOUBLE || rt == LDOUBLE)
+               return LDOUBLE;
+       if (lt == DOUBLE || rt == DOUBLE)
+               return DOUBLE;
+       if (lt == FLOAT || rt == FLOAT)
+               return FLOAT;
+
+       /*
+        * If type A has more bits than type B, it should be able to hold all
+        * possible values of type B.
+        */
+       if (size_in_bits(lt) > size_in_bits(rt))
+               return lt;
+       if (size_in_bits(lt) < size_in_bits(rt))
+               return rt;
+
+       size_t i;
+       for (i = 3; arith_rank[i] != INT; i++)
+               if (arith_rank[i] == lt || arith_rank[i] == rt)
+                       break;
+       if ((is_uinteger(lt) || is_uinteger(rt)) &&
+           !is_uinteger(arith_rank[i]))
+               i--;
+       return arith_rank[i];
+}
+
 /*
- * Apply the "usual arithmetic conversions" (C99 6.3.1.8).
- *
- * This gives both operands the same type.
- * This is done in different ways for traditional C and C90.
+ * Apply the "usual arithmetic conversions" (C99 6.3.1.8), which gives both
+ * operands the same type.
  */
 static void
 balance(op_t op, tnode_t **lnp, tnode_t **rnp)
 {
-       tspec_t lt, rt, t;
-       int     i;
-       bool    u;
-       static const tspec_t tl[] = {
-               LDOUBLE, DOUBLE, FLOAT,
-#ifdef INT128_SIZE
-               UINT128, INT128,
-#endif
-               UQUAD, QUAD,
-               ULONG, LONG,
-               UINT, INT,
-       };
-
-       lt = (*lnp)->tn_type->t_tspec;
-       rt = (*rnp)->tn_type->t_tspec;
-
+
+       tspec_t lt = (*lnp)->tn_type->t_tspec;
+       tspec_t rt = (*rnp)->tn_type->t_tspec;
        if (!is_arithmetic(lt) || !is_arithmetic(rt))
                return;
 
-       if (allow_c90) {
-               if (lt == rt) {
-                       t = lt;
-               } else if (lt == LCOMPLEX || rt == LCOMPLEX) {
-                       t = LCOMPLEX;
-               } else if (lt == DCOMPLEX || rt == DCOMPLEX) {
-                       t = DCOMPLEX;
-               } else if (lt == FCOMPLEX || rt == FCOMPLEX) {
-                       t = FCOMPLEX;
-               } else if (lt == LDOUBLE || rt == LDOUBLE) {
-                       t = LDOUBLE;
-               } else if (lt == DOUBLE || rt == DOUBLE) {
-                       t = DOUBLE;
-               } else if (lt == FLOAT || rt == FLOAT) {
-                       t = FLOAT;
-               } else {
-                       /*
-                        * If type A has more bits than type B it should
-                        * be able to hold all possible values of type B.
-                        */
-                       if (size_in_bits(lt) > size_in_bits(rt)) {
-                               t = lt;
-                       } else if (size_in_bits(lt) < size_in_bits(rt)) {
-                               t = rt;
-                       } else {
-                               for (i = 3; tl[i] != INT; i++) {
-                                       if (tl[i] == lt || tl[i] == rt)
-                                               break;
-                               }
-                               if ((is_uinteger(lt) || is_uinteger(rt)) &&
-                                   !is_uinteger(tl[i])) {
-                                       i--;
-                               }
-                               t = tl[i];
-                       }
-               }
-       } else {
-               /* Keep unsigned in traditional C */
-               u = is_uinteger(lt) || is_uinteger(rt);
-               for (i = 0; tl[i] != INT; i++) {
-                       if (lt == tl[i] || rt == tl[i])
-                               break;
-               }
-               t = tl[i];
-               if (u && is_integer(t) && !is_uinteger(t))
-                       t = unsigned_type(t);
-       }
+       tspec_t t = allow_c90
+           ? usual_arithmetic_conversion_c90(lt, rt)
+           : usual_arithmetic_conversion_trad(lt, rt);
 
        if (t != lt)
                *lnp = apply_usual_arithmetic_conversions(op, *lnp, t);



Home | Main Index | Thread Index | Old Index