From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27694 invoked by alias); 27 Jul 2007 19:34:44 -0000 Received: (qmail 27636 invoked by alias); 27 Jul 2007 19:34:35 -0000 Date: Fri, 27 Jul 2007 19:34:00 -0000 Message-ID: <20070727193435.27635.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug libfortran/32841] [4.3 regression] HUGE(1.0d0) output as +Infinity on ppc-darwin8 In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "dominiq at lps dot ens dot fr" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2007-07/txt/msg02776.txt.bz2 ------- Comment #19 from dominiq at lps dot ens dot fr 2007-07-27 19:34 ------- Subject: Re: [4.3 regression] HUGE(1.0d0) output as +Infinity on ppc-darwin8 > Hum, I don't see anything in rev. 123623 > (http://gcc.gnu.org/viewcvs?view=rev&revision=123623) that looks too > suspicious. What would need to be done now, in my opinion, is to: > 1. check that rev. 123622 passes, > ... I cannot say that I am fond of this brute force approach!-(it has to go too far in the past to look practical). Before that I'ld like to understand what's going wrong. In the meantime a quick and blind fix is to replace in libgfortran/libgfortran.h the line #if defined(HAVE_BROKEN_ISFINITE) || defined(__CYGWIN__) by #if defined(HAVE_BROKEN_ISFINITE) || defined(__CYGWIN__) || defined(whatever_for_PPC_Darwin) This fix the failure: FAIL: gfortran.dg/large_real_kind_2.F90 -O0 execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O1 execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O2 execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O3 -fomit-frame-pointer execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: gfortran.dg/large_real_kind_2.F90 -O3 -g execution test FAIL: gfortran.dg/large_real_kind_2.F90 -Os execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O0 execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O1 execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O2 execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O3 -fomit-frame-pointer execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -O3 -g execution test FAIL: gfortran.dg/large_real_kind_form_io_2.f90 -Os execution test FAIL: gfortran.fortran-torture/compile/pr32417.f90, "-O" (internal compiler error) === gfortran Summary for unix/-m32 === # of expected passes 19398 # of unexpected failures 17 # of expected failures 9 # of unsupported tests 58 /opt/gcc/darwin_build/gcc/testsuite/gfortran/../../gfortran version 4.3.0 20070720 (experimental) Now among the many things I don't understand is the following facts. (1) the following program: #include #include #ifdef HAVE_MATH_H #include #endif #include int main () { #ifdef isfinite #ifdef LDBL_MAX printf("LDBL_MAX is defined\n"); if (!isfinite(LDBL_MAX)) printf("bad long double\n"); #endif #ifdef DBL_MAX printf("DBL_MAX is defined\n"); if (!isfinite(DBL_MAX)) printf("bad double\n"); #endif printf("isfinite defined\n"); #endif printf("end of test\n"); } gives: LDBL_MAX is defined bad long double DBL_MAX is defined isfinite defined end of test when compiled with gcc version 4.3.0 20070720 and LDBL_MAX is defined DBL_MAX is defined isfinite defined end of test when compiled with gcc version 4.0.1 (Apple Computer, Inc. build 5367) using gcc?? -DHAVE_MATH_H isfinite_p.c (gcc?? stands for the different flavors). By any chance is it possible that libgfortran/configure uses the system gcc and not xgcc? In that case that would explain why the broken isfinite is not detected. (2) From this it seems that isfinite(DBL_MAX) is working. Why is it not working when writing HUGE(1.0d0)? Does the writing use long doubles? -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32841