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