Module Name: src Committed By: rillig Date: Tue Jun 15 16:56:00 UTC 2021
Modified Files: src/usr.bin/xlint/lint1: tree.c Log Message: lint: extract convert_constant_floating No functional change. To generate a diff of this commit: cvs rdiff -u -r1.281 -r1.282 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/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.281 src/usr.bin/xlint/lint1/tree.c:1.282 --- src/usr.bin/xlint/lint1/tree.c:1.281 Tue May 4 05:40:10 2021 +++ src/usr.bin/xlint/lint1/tree.c Tue Jun 15 16:56:00 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.281 2021/05/04 05:40:10 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.282 2021/06/15 16:56:00 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.281 2021/05/04 05:40:10 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.282 2021/06/15 16:56:00 rillig Exp $"); #endif #include <float.h> @@ -2090,6 +2090,76 @@ check_pointer_conversion(tnode_t *tn, ty } } +static void +convert_constant_floating(const op_t op, int arg, const tspec_t ot, + const type_t *tp, const tspec_t nt, val_t *const v, + val_t *const nv) +{ + ldbl_t max = 0.0, min = 0.0; + + switch (nt) { + case CHAR: + max = TARG_CHAR_MAX; min = TARG_CHAR_MIN; break; + case UCHAR: + max = TARG_UCHAR_MAX; min = 0; break; + case SCHAR: + max = TARG_SCHAR_MAX; min = TARG_SCHAR_MIN; break; + case SHORT: + max = TARG_SHRT_MAX; min = TARG_SHRT_MIN; break; + case USHORT: + max = TARG_USHRT_MAX; min = 0; break; + case ENUM: + case INT: + max = TARG_INT_MAX; min = TARG_INT_MIN; break; + case UINT: + max = (u_int)TARG_UINT_MAX;min = 0; break; + case LONG: + max = TARG_LONG_MAX; min = TARG_LONG_MIN; break; + case ULONG: + max = (u_long)TARG_ULONG_MAX; min = 0; break; + case QUAD: + max = QUAD_MAX; min = QUAD_MIN; break; + case UQUAD: + max = (uint64_t)UQUAD_MAX; min = 0; break; + case FLOAT: + case FCOMPLEX: + max = FLT_MAX; min = -FLT_MAX; break; + case DOUBLE: + case DCOMPLEX: + max = DBL_MAX; min = -DBL_MAX; break; + case PTR: + /* Got already an error because of float --> ptr */ + case LDOUBLE: + case LCOMPLEX: + max = LDBL_MAX; min = -LDBL_MAX; break; + default: + lint_assert(/*CONSTCOND*/false); + } + if (v->v_ldbl > max || v->v_ldbl < min) { + lint_assert(nt != LDOUBLE); + if (op == FARG) { + /* conv. of '%s' to '%s' is out of range, ... */ + warning(295, + type_name(gettyp(ot)), type_name(tp), arg); + } else { + /* conversion of '%s' to '%s' is out of range */ + warning(119, + type_name(gettyp(ot)), type_name(tp)); + } + v->v_ldbl = v->v_ldbl > 0 ? max : min; + } + if (nt == FLOAT) { + nv->v_ldbl = (float)v->v_ldbl; + } else if (nt == DOUBLE) { + nv->v_ldbl = (double)v->v_ldbl; + } else if (nt == LDOUBLE) { + nv->v_ldbl = v->v_ldbl; + } else { + nv->v_quad = (nt == PTR || is_uinteger(nt)) ? + (int64_t)v->v_ldbl : (int64_t)v->v_ldbl; + } +} + /* * Converts a typed constant to a constant of another type. * @@ -2103,7 +2173,6 @@ void convert_constant(op_t op, int arg, const type_t *tp, val_t *nv, val_t *v) { tspec_t ot, nt; - ldbl_t max = 0.0, min = 0.0; int sz; bool rchk; int64_t xmask, xmsk1; @@ -2124,67 +2193,7 @@ convert_constant(op_t op, int arg, const } if (ot == FLOAT || ot == DOUBLE || ot == LDOUBLE) { - switch (nt) { - case CHAR: - max = TARG_CHAR_MAX; min = TARG_CHAR_MIN; break; - case UCHAR: - max = TARG_UCHAR_MAX; min = 0; break; - case SCHAR: - max = TARG_SCHAR_MAX; min = TARG_SCHAR_MIN; break; - case SHORT: - max = TARG_SHRT_MAX; min = TARG_SHRT_MIN; break; - case USHORT: - max = TARG_USHRT_MAX; min = 0; break; - case ENUM: - case INT: - max = TARG_INT_MAX; min = TARG_INT_MIN; break; - case UINT: - max = (u_int)TARG_UINT_MAX;min = 0; break; - case LONG: - max = TARG_LONG_MAX; min = TARG_LONG_MIN; break; - case ULONG: - max = (u_long)TARG_ULONG_MAX; min = 0; break; - case QUAD: - max = QUAD_MAX; min = QUAD_MIN; break; - case UQUAD: - max = (uint64_t)UQUAD_MAX; min = 0; break; - case FLOAT: - case FCOMPLEX: - max = FLT_MAX; min = -FLT_MAX; break; - case DOUBLE: - case DCOMPLEX: - max = DBL_MAX; min = -DBL_MAX; break; - case PTR: - /* Got already an error because of float --> ptr */ - case LDOUBLE: - case LCOMPLEX: - max = LDBL_MAX; min = -LDBL_MAX; break; - default: - lint_assert(/*CONSTCOND*/false); - } - if (v->v_ldbl > max || v->v_ldbl < min) { - lint_assert(nt != LDOUBLE); - if (op == FARG) { - /* conv. of '%s' to '%s' is out of range, ... */ - warning(295, - type_name(gettyp(ot)), type_name(tp), arg); - } else { - /* conversion of '%s' to '%s' is out of range */ - warning(119, - type_name(gettyp(ot)), type_name(tp)); - } - v->v_ldbl = v->v_ldbl > 0 ? max : min; - } - if (nt == FLOAT) { - nv->v_ldbl = (float)v->v_ldbl; - } else if (nt == DOUBLE) { - nv->v_ldbl = (double)v->v_ldbl; - } else if (nt == LDOUBLE) { - nv->v_ldbl = v->v_ldbl; - } else { - nv->v_quad = (nt == PTR || is_uinteger(nt)) ? - (int64_t)v->v_ldbl : (int64_t)v->v_ldbl; - } + convert_constant_floating(op, arg, ot, tp, nt, v, nv); } else { if (nt == FLOAT) { nv->v_ldbl = (ot == PTR || is_uinteger(ot)) ?