http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57496
Bug ID: 57496
Summary: I/O: WRITE(*,*) HUGE(0_16) [REAL(10)+REAL(16)]: Gives
SIGFPE with -ffpe-trap=overflow
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: burnus at gcc dot gnu.org
CC: jb at gcc dot gnu.org, jvdelisle at gcc dot gnu.org
Reported at http://gcc.gnu.org/ml/fortran/2013-05/msg00136.html /
http://gcc.gnu.org/ml/fortran/2013-05/msg00138.html
The following program gives a floating-point exception when compiled with
-ffpe-trap=overflow:
print *, huge(0.0_10)
print *, huge(0.0_16)
end
The segfault occurs for:
WRITE_FLOAT(10,L)
and
WRITE_FLOAT(16,Q)
in libgfortran/io/write_float.def
I have not debugged the code. However, I realized that the following has to be
done - in addition - as one otherwise calls the wrong functions for __float128.
--- a/libgfortran/io/write_float.def
+++ b/libgfortran/io/write_float.def
@@ -963,0 +964,28 @@ __qmath_(quadmath_snprintf) (buffer, size, "%+-#.*Qf", \
+#if defined(GFC_REAL_16_IS_FLOAT128)
+#define ISFINITE2(prec,val) finiteq(val)
+#endif
+#define ISFINITE2(prec,val) isfinite(val)
+#define ISFINITE2L(prec,val) isfinite(val)
+
+#define ISFINITE(suff,val) TOKENPASTE(ISFINITE2,suff)(val)
+
+
+#if defined(GFC_REAL_16_IS_FLOAT128)
+#define SIGNBIT2(prec,val) signbitq(val)
+#endif
+#define SIGNBIT2(prec,val) signbit(val)
+#define SIGNBIT2L(prec,val) signbit(val)
+
+#define SIGNBIT(suff,val) TOKENPASTE(SIGNBIT2,suff)(val)
+
+
+#if defined(GFC_REAL_16_IS_FLOAT128)
+#define ISNAN2(prec,val) isnanq(val)
+#endif
+#define ISNAN2(prec,val) isnan(val)
+#define ISNAN2L(prec,val) isnan(val)
+
+#define ISNAN(suff,val) TOKENPASTE(ISNAN2,suff)(val)
+
+
+
@@ -1197,2 +1225,2 @@ determine_en_precision (st_parameter_dt *dtp, const fnode
- sign_bit = signbit (tmp);\
- if (!isfinite (tmp))\
+ sign_bit = SIGNBIT (x,tmp);\
+ if (!ISFINITE (x,tmp))\
@@ -1200 +1228 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f,
- write_infnan (dtp, f, isnan (tmp), sign_bit);\
+ write_infnan (dtp, f, ISNAN (x,tmp), sign_bit);\