https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96983

Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|WAITING                     |NEW
             Target|powerpc64*-linux-gnu,       |powerpc64*-linux-gnu,
                   |sparc*-sun-solaris2.11      |sparc*-*-*
                 CC|                            |ebotcazou at gcc dot gnu.org

--- Comment #30 from Eric Botcazou <ebotcazou at gcc dot gnu.org> ---
AFAICS the code implicitly assumes that __float128 exists, which is *not* the
common case among 64-bit architectures since "long double" is generally
128-bit.

Tentative fix for the SPARC at least:

diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 5c9258c65c3..ae359a07973 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -407,7 +407,10 @@ build_round_expr (tree arg, tree restype)
       if (kind < 0)
        gfc_internal_error ("Could not find real kind with at least %d bits",
                            resprec);
-      arg = fold_convert (gfc_float128_type_node, arg);
+      if (gfc_real16_is_float128)
+       arg = fold_convert (gfc_float128_type_node, arg);
+      else
+       arg = fold_convert (long_double_type_node, arg);
       fn = gfc_builtin_decl_for_float_kind (BUILT_IN_ROUND, kind);
     }
   else
  • [Bug fortran/96983] [11 regress... ebotcazou at gcc dot gnu.org via Gcc-bugs

Reply via email to