https://gcc.gnu.org/g:940a1c98e745d6c8100def432655c0165acb6cc1
commit r17-5058-g940a1c98e745d6c8100def432655c0165acb6cc1 Author: Jose E. Marchesi <[email protected]> Date: Sun Oct 11 08:17:55 2026 +0200 a68: fix selection of builtin in a68_real_pow [PR algol68/127797] The commit r17-4978-g0cb6acb4fc5a285928a191ced403e0c27776344b introduced a regression in targets in which the precision of modes made it impossible to distinguish an int from a real. The second operand of pow is now checked by mode instead. Signed-off-by: Jose E. Marchesi <[email protected]> gcc/algol68/ChangeLog PR algol68/127797 * a68-low-reals.cc (a68_real_pow): Fix selection of pow builtin. Diff: --- gcc/algol68/a68-low-reals.cc | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/gcc/algol68/a68-low-reals.cc b/gcc/algol68/a68-low-reals.cc index 6754a90b1c9f..b9596ce27eda 100644 --- a/gcc/algol68/a68-low-reals.cc +++ b/gcc/algol68/a68-low-reals.cc @@ -387,7 +387,7 @@ a68_real_entier (tree val, MOID_T *to_mode, MOID_T *from_mode) const int int_prec = TYPE_PRECISION (integer_type_node); const int long_int_prec = TYPE_PRECISION (long_integer_type_node); const int long_long_int_prec = TYPE_PRECISION (long_long_integer_type_node); - + if (from_mode_prec == TYPE_PRECISION (CTYPE (M_REAL))) { if (to_mode_prec == int_prec) @@ -441,7 +441,7 @@ a68_real_round (tree val, MOID_T *to_mode, MOID_T *from_mode) const int int_prec = TYPE_PRECISION (integer_type_node); const int long_int_prec = TYPE_PRECISION (long_integer_type_node); const int long_long_int_prec = TYPE_PRECISION (long_long_integer_type_node); - + if (from_mode_prec == TYPE_PRECISION (CTYPE (M_REAL))) { if (to_mode_prec == int_prec) @@ -587,30 +587,26 @@ a68_real_pow (MOID_T *m, MOID_T *a_mode, MOID_T *b_mode, { int m_prec = TYPE_PRECISION (CTYPE (m)); int a_mode_prec = TYPE_PRECISION (CTYPE (a_mode)); - int b_mode_prec = TYPE_PRECISION (CTYPE (b_mode)); - const int real_prec = TYPE_PRECISION (CTYPE (M_REAL)); - const int long_real_prec = TYPE_PRECISION (CTYPE (M_LONG_REAL)); - const int long_long_real_prec = TYPE_PRECISION (CTYPE (M_LONG_LONG_REAL)); - + const int float_prec = TYPE_PRECISION (float_type_node); + const int double_prec = TYPE_PRECISION (double_type_node); + const int long_double_prec = TYPE_PRECISION (long_double_type_node); + enum built_in_function built_in; - if (m_prec == real_prec) + if (m_prec == float_prec) { - gcc_assert (a_mode_prec == real_prec); - built_in - = (b_mode_prec == real_prec) ? BUILT_IN_POWF : BUILT_IN_POWIF; + gcc_assert (a_mode_prec == float_prec); + built_in = IS_REAL (b_mode) ? BUILT_IN_POWF : BUILT_IN_POWIF; } - else if (m_prec == long_real_prec) + else if (m_prec == double_prec) { - gcc_assert (a_mode_prec == long_real_prec); - built_in = - (b_mode_prec == long_real_prec) ? BUILT_IN_POW : BUILT_IN_POWI; + gcc_assert (a_mode_prec == double_prec); + built_in = IS_REAL (b_mode) ? BUILT_IN_POW : BUILT_IN_POWI; } - else if (m_prec == long_long_real_prec) + else if (m_prec == long_double_prec) { - gcc_assert (a_mode_prec == long_long_real_prec); - built_in - = (b_mode_prec == long_long_real_prec) ? BUILT_IN_POWL : BUILT_IN_POWIL; + gcc_assert (a_mode_prec == long_double_prec); + built_in = IS_REAL (b_mode) ? BUILT_IN_POWL : BUILT_IN_POWIL; } else gcc_unreachable ();
