Commit c2df3c99 by Jakub Jelinek Committed by Jakub Jelinek

re PR c/89520 (ICE tree check: accessed operand 4 of call_expr with 3 operands…

re PR c/89520 (ICE tree check: accessed operand 4 of call_expr with 3 operands in convert_to_integer_1, at convert.c:668)

	PR c/89520
	* convert.c (convert_to_real_1, convert_to_integer_1): Punt for
	builtins if they don't have a single scalar floating point argument.
	Formatting fixes.

	* gcc.dg/pr89520-1.c: New test.
	* gcc.dg/pr89520-2.c: New test.

From-SVN: r269273
parent b0cf10e4
2019-02-28 Jakub Jelinek <jakub@redhat.com>
PR c/89520
* convert.c (convert_to_real_1, convert_to_integer_1): Punt for
builtins if they don't have a single scalar floating point argument.
Formatting fixes.
2019-02-27 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR rtl-optimization/89490
......
......@@ -216,12 +216,15 @@ convert_to_real_1 (tree type, tree expr, bool fold_p)
CASE_MATHFN (FABS)
CASE_MATHFN (LOGB)
#undef CASE_MATHFN
if (call_expr_nargs (expr) != 1
|| !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (expr, 0))))
break;
{
tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0));
tree newtype = type;
/* We have (outertype)sqrt((innertype)x). Choose the wider mode from
the both as the safe type for operation. */
/* We have (outertype)sqrt((innertype)x). Choose the wider mode
from the both as the safe type for operation. */
if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type))
newtype = TREE_TYPE (arg0);
......@@ -618,7 +621,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
CASE_FLT_FN (BUILT_IN_ROUND):
CASE_FLT_FN_FLOATN_NX (BUILT_IN_ROUND):
/* Only convert in ISO C99 mode and with -fno-math-errno. */
if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math)
if (!targetm.libc_has_function (function_c99_misc)
|| flag_errno_math)
break;
if (outprec < TYPE_PRECISION (integer_type_node)
|| (outprec == TYPE_PRECISION (integer_type_node)
......@@ -641,7 +645,8 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
CASE_FLT_FN (BUILT_IN_RINT):
CASE_FLT_FN_FLOATN_NX (BUILT_IN_RINT):
/* Only convert in ISO C99 mode and with -fno-math-errno. */
if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math)
if (!targetm.libc_has_function (function_c99_misc)
|| flag_errno_math)
break;
if (outprec < TYPE_PRECISION (integer_type_node)
|| (outprec == TYPE_PRECISION (integer_type_node)
......@@ -657,14 +662,20 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
CASE_FLT_FN (BUILT_IN_TRUNC):
CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC):
return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0), dofold);
if (call_expr_nargs (s_expr) != 1
|| !SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
break;
return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0),
dofold);
default:
break;
}
if (fn)
{
if (fn
&& call_expr_nargs (s_expr) == 1
&& SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
{
tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
return convert_to_integer_1 (type, newexpr, dofold);
}
......@@ -694,7 +705,9 @@ convert_to_integer_1 (tree type, tree expr, bool dofold)
break;
}
if (fn)
if (fn
&& call_expr_nargs (s_expr) == 1
&& SCALAR_FLOAT_TYPE_P (TREE_TYPE (CALL_EXPR_ARG (s_expr, 0))))
{
tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0));
return convert_to_integer_1 (type, newexpr, dofold);
......
2019-02-28 Jakub Jelinek <jakub@redhat.com>
PR c/89520
* gcc.dg/pr89520-1.c: New test.
* gcc.dg/pr89520-2.c: New test.
2019-02-27 Marek Polacek <polacek@redhat.com>
PR c++/88857 - ICE with value-initialization of argument in template.
......
/* PR c/89520 */
/* { dg-do compile } */
/* { dg-options "-Ofast -w" } */
#define A(name) __typeof (__builtin_##name (0)) name (); long name##1 () { return name (); }
#define B(name) A(name) A(name##f) A(name##l)
B (ceil)
B (floor)
B (round)
B (trunc)
B (nearbyint)
B (rint)
B (logb)
/* PR c/89520 */
/* { dg-do compile } */
/* { dg-options "-Ofast -w" } */
#define A(name) __typeof (__builtin_##name (0)) name (); \
float name##1 () { return name (); } \
double name##2 () { return name (); }
#define B(name) A(name) A(name##l)
B (cosh)
B (exp)
B (exp10)
B (exp2)
B (expm1)
B (gamma)
B (j0)
B (j1)
B (lgamma)
B (pow10)
B (sinh)
B (tgamma)
B (y0)
B (y1)
B (acos)
B (acosh)
B (asin)
B (asinh)
B (atan)
B (atanh)
B (cbrt)
B (cos)
B (erf)
B (erfc)
B (log)
B (log10)
B (log2)
B (log1p)
B (sin)
B (tan)
B (tanh)
B (sqrt)
B (fabs)
B (logb)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment