[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-12-11 Thread burnus at gcc dot gnu dot org


--- Comment #14 from burnus at gcc dot gnu dot org  2007-12-11 23:15 ---
 As I understand the F2003 standard, the expression INT(z'ff',1) should
 produce a range error, for the same reasons as the data statement illustrated
 in:
 http://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html
 In practice, I don't think any compilers do this (yet).

Well, I am not sure whether the compiler is required to do so; with some BOZ
work, I disabled accidentally some range checks (see PR 34398), but your INT
gives an error with gfortran:

print *, INT(z'ff',1)
1
Error: Result of INT overflows its kind at (1)

(Note: the value 1 is a (common) implementation choice; not every compiler
has kind = byte size.)


 Maybe there should be a -f[no-]boz-range-check to exclude range errors just
 for the BOZ case.
I think -fno-range-check should be enough for both, shouldn't it?


 F2008 draft, it re-defines B/O/Z literals, named BITS instead of BOZ.
That part got dropped, see 13 August at:
http://www.nag.co.uk/sc22wg5/


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-12-11 Thread jkrahn at nc dot rr dot com


--- Comment #15 from jkrahn at nc dot rr dot com  2007-12-12 01:04 ---
Subject: Re:  Warn with -std=f95/f2003 when BOZ is used
 at invalid places

burnus at gcc dot gnu dot org wrote:
...
 Maybe there should be a -f[no-]boz-range-check to exclude range errors just
 for the BOZ case.
 I think -fno-range-check should be enough for both, shouldn't it?
My feeling is that BOZ range errors will occur often due to a poorly
designed spec, but that other range errors may really be bugs.
Alternatively, it might be good to a define BOZ mode flag, especially
since gfortran already supports a non-standard extension, and because
the vague standard means that there will be differences among compilers.

 
 F2008 draft, it re-defines B/O/Z literals, named BITS instead of BOZ.
 That part got dropped, see 13 August at:
 http://www.nag.co.uk/sc22wg5/
 
Well, I hope that they at least update the BOZ specification.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-12-08 Thread burnus at gcc dot gnu dot org


--- Comment #10 from burnus at gcc dot gnu dot org  2007-12-08 21:47 ---
Subject: Bug 29471

Author: burnus
Date: Sat Dec  8 21:46:56 2007
New Revision: 130713

URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=130713
Log:
2007-12-08  Tobias Burnus  [EMAIL PROTECTED]

PR fortran/34342
PR fortran/34345
PR fortran/18026
PR fortran/29471

* gfortran.texi (BOZ literal constants): Improve documentation
and adapt for BOZ changes.
* Make-lang.ini (resolve.o): Add target-memory.h dependency.
* gfortran.h (gfc_expr): Add is_boz flag.
* expr.c: Include target-memory.h.
(gfc_check_assign): Support transferring BOZ for real/cmlx.
* resolve.c: Include target-memory.h
(resolve_ordinary_assign): Support transferring BOZ for real/cmlx.
* target-memory.c (gfc_convert_boz): New function.
* target-memory.c (gfc_convert_boz): Add prototype.
* primary.c (match_boz_constant): Set is_boz, enable F95 error
also without -pedantic, and allow for Fortran 2003 BOZ.
(match_real_constant): Fix comment.
* simplify.c
* (simplify_cmplx,gfc_simplify_dble,gfc_simplify_float,
gfc_simplify_real): Support Fortran 2003 BOZ.

2007-12-08  Tobias Burnus  [EMAIL PROTECTED]

PR fortran/34342
PR fortran/34345
PR fortran/18026
PR fortran/29471

* gfortran.dg/boz_8.f90: New.
* gfortran.dg/boz_9.f90: New.
* gfortran.dg/boz_10.f90: New.
* gfortran.dg/boz_7.f90: Update dg-warning.
* gfortran.dg/pr16433.f: Add dg-error.
* gfortan.dg/ibits.f90: Update dg-warning.
* gfortran.dg/unf_io_convert_1.f90: Update/delete dg-warning.
* gfortran.dg/unf_io_convert_2.f90: Ditto.


Added:
trunk/gcc/testsuite/gfortran.dg/boz_10.f90
trunk/gcc/testsuite/gfortran.dg/boz_8.f90
trunk/gcc/testsuite/gfortran.dg/boz_9.f90
Modified:
trunk/gcc/fortran/ChangeLog
trunk/gcc/fortran/Make-lang.in
trunk/gcc/fortran/expr.c
trunk/gcc/fortran/gfortran.h
trunk/gcc/fortran/gfortran.texi
trunk/gcc/fortran/primary.c
trunk/gcc/fortran/resolve.c
trunk/gcc/fortran/simplify.c
trunk/gcc/fortran/target-memory.c
trunk/gcc/fortran/target-memory.h
trunk/gcc/testsuite/ChangeLog
trunk/gcc/testsuite/gfortran.dg/boz_7.f90
trunk/gcc/testsuite/gfortran.dg/ibits.f90
trunk/gcc/testsuite/gfortran.dg/pr16433.f
trunk/gcc/testsuite/gfortran.dg/unf_io_convert_1.f90
trunk/gcc/testsuite/gfortran.dg/unf_io_convert_2.f90


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-12-08 Thread burnus at gcc dot gnu dot org


--- Comment #11 from burnus at gcc dot gnu dot org  2007-12-08 22:08 ---
FIXED on the trunk (4.3.0).

 Fortran 95: Only in DATA and only integer
 Fortran 2003: Only in DATA or as argument of INT, REAL, DBLE, CMPLX

Fortran 2003 BOZ are now properly supported.

For -std=f95 full diagnostics exist, however, for -std=f2003 gfortran allows
BOZ also at invalid places, see PR 34392.

For the supported BOZ extensions, see also:
http://gcc.gnu.org/onlinedocs/gfortran/BOZ-literal-constants.html

(Wait a day until that page is up to date.)


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-12-08 Thread burnus at gcc dot gnu dot org


--- Comment #12 from burnus at gcc dot gnu dot org  2007-12-08 22:09 ---
Mark really as FIXED.


-- 

burnus at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution||FIXED
   Target Milestone|--- |4.3.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-08-12 Thread fxcoudert at gcc dot gnu dot org


-- 

fxcoudert at gcc dot gnu dot org changed:

   What|Removed |Added

 Status|UNCONFIRMED |NEW
 Ever Confirmed|0   |1
   Last reconfirmed|-00-00 00:00:00 |2007-08-12 20:10:32
   date||


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-03-16 Thread burnus at gcc dot gnu dot org


--- Comment #9 from burnus at gcc dot gnu dot org  2007-03-16 09:45 ---
 The current problem is shown in this bit of code:
   write(*,*)'NaN(8)=',real(z'FFF8',8)
   end

Note: gfortran does not support Fortran 2003 BOZ yet.

 gfortran, even with -std=f2003, claims that the BOZ data is too big.
Use -fno-range-check to disable this checking. But this will still the old BOZ
extension and not the Fortran 2003 BOZ.

 Even without the reinterpret cast problem, integer BOZ is not handled
 correctly. This expression also claims the BOZ is too large:
int(z'',8)

The number is does not fit into -huge(1_8) ... huge(1_8) and is therefore
outside of the Fortran standard. - -fno-range-check

 The traditional behavior is for all BOZ to be initially interpreted as the
 largets integer type supported.

Which is why gfortran gives no error if you use int(BOZ, kind=16).

 The only hassle with processor dependent definitions is that the result of a
 given binary value depends on a processor's internal binary format. So, IEEE
 floats are portable, but other long/quad real numbers are not.
Processor dependent in the Fortran language does not only mean the CPU but
also the compiler; nonetheless, in this regard most (all?) compilers produce
the same result on a given platform.

 A related problem is that I am trying to create a NaN constant (parameter). I
 can't use REAL+BOZ, but I also cannot define real :: NaN = 0.0/0.0. In this
 case, divide-by-zero is invalid math, but should only be a warning and not an
 error. (I am speaking practically; I don't know what the standards say.)

The standard does not say anything about non-Fortran numbers. Fortran 2003 has
now support of the IEEE arithmetics, which allows NaN, denormalized numbers and
+/-INF, overflowing etc.

Thus for a Fortran 95 compiler, the 0./0. can always be rejected, whereas for
Fortran 2003 it is a bit unclearer (cf. below for a standard way to get Nan).

my personal trick is to use:
 real :: r, NaN
 r = 0.0
 NaN = 0.0/r
which does the NaN at run time. (You still need to have the right compiler
flags as otherwise you get an arithmetic exception at run time.)

 But, good news, I just discovered that this hack works:
   NaN = transfer(ishft(int(z'FFF8',8),32),0.0_8)
 I tried that a while back with gfortran and it crashed.

A modified version still crashes with gfortran:
  real(kind(0d0)) :: NaN = transfer(ishft(int(z'FFF8',8),32),0d0)
  print *, NaN
Interestingly, this produces 0.0 with ifort, while g95 and sunf95 give NaN.
See PR 31194.

 What we really need is a NAN(kind=8) intrinsic.

Well, one can do in Fortran 2003:
 use,intrinsic :: ieee_arithmetic
 real :: NaN
 NaN = ieee_value(x,ieee_quiet_nan)

(Note: IEEE arithmetic is not yet supported by many compilers, especially
gfortran does not support it yet.)

(In reply to comment #6)
 My vote is to just ignore the standards when it
 comes to negative BOZ, the way Intel has done it, which I HOPE is what F2008
 says.

Sorry, I think most people would like to have a standard conform compiler; we
cannot do so.

Besides IEEE arithmetic allows what you want. Using transfer is a non-portable
way to do so, which assumes a certain internal structure. And using your
integer BOZ are supported with -fno-range-check.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-03-15 Thread jkrahn at nc dot rr dot com


--- Comment #5 from jkrahn at nc dot rr dot com  2007-03-16 03:46 ---
BOZ processing was recently broken in gfortran. I assume it relates to the
issues here.

The current problem is shown in this bit of code:

  write(*,*)'NaN(8)=',real(z'FFF8',8)
  end

gfortran, even with -std=f2003, claims that the BOZ data is too big.
Apparently, it is first converting to an UNSIGNED integer, then trying to cast
to a SIGNED Fortran integer. With F2003, this form of BOZ should do a
'reinterpret-cast' of raw binary bits directly to the destination type.

Even without the reinterpret cast problem, integer BOZ is not handled
correctly. This expression also claims the BOZ is too large:
   int(z'',8)

Again, it is being intepreted as an UNSIGNED int then static-cast to a signed
in, thus overflowing.

The traditional behavior is for all BOZ to be initially interpreted as the
largets integer type supported. As usual with Fortran, that is a horrible
definition. In order to define a -1 BYTE, you have to write out the whole
8-bytes worth of FF. Intel seems to use a sane (but nonstandard) method that
appears to interpret initially as the smallest type that contains all of the
bits specified.

F95 dropped BOZ because of the lame definition, but F2003 brought it back for
use mainly within REAL() and INT(), which allow the raw initial interpretation
in a sensible way.

The only hassle with processor dependent definitions is that the result of a
given binary value depends on a processor's internal binary format. So, IEEE
floats are portable, but other long/quad real numbers are not. In any case, it
comes down to a raw binary value converted directly to the destination for the
F2003 forms.

For the older form, which is still the case in F2003 for DATA statements, it is
hard to know whether to 'cheat' and allow z'FF' to define a -1 byte, or stick
to the strict messed-up definition. What did G77 do?

A related problem is that I am trying to create a NaN constant (parameter). I
can't use REAL+BOZ, but I also cannot define real :: NaN = 0.0/0.0. In this
case, divide-by-zero is invalid math, but should only be a warning and not an
error. (I am speaking practically; I don't know what the standards say.)

But, good news, I just discovered that this hack works:
  NaN = transfer(ishft(int(z'FFF8',8),32),0.0_8)

I tried that a while back with gfortran and it crashed. What we really need is
a NAN(kind=8) intrinsic.


-- 

jkrahn at nc dot rr dot com changed:

   What|Removed |Added

 CC||jkrahn at nc dot rr dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-03-15 Thread jkrahn at nc dot rr dot com


--- Comment #6 from jkrahn at nc dot rr dot com  2007-03-16 03:53 ---
One more comment: I just checked the INT() intrisic for F2003. It actually
still states that a BOZ is initially interpreted as the largest integer type
(ugh!) REAL() has the correct definition of interpreting as the target REAL
kind. I have to assume that they think a LARGE integer will hold all BOZ
values, and can simply be down-cast. Could they actually have forgotten about
negative values?!?

I have not checked F2008 yet. My vote is to just ignore the standards when it
comes to negative BOZ, the way Intel has done it, which I HOPE is what F2008
says.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-03-15 Thread sgk at troutmask dot apl dot washington dot edu


--- Comment #7 from sgk at troutmask dot apl dot washington dot edu  
2007-03-16 04:07 ---
Subject: Re:  Warn with -std=f95/f2003 when BOZ is used at invalid places

On Fri, Mar 16, 2007 at 03:46:30AM -, jkrahn at nc dot rr dot com wrote:
 
 
 --- Comment #5 from jkrahn at nc dot rr dot com  2007-03-16 03:46 ---
 BOZ processing was recently broken in gfortran.

No, it was fixed.

 I assume it relates to the issues here.
 
 The current problem is shown in this bit of code:
 
   write(*,*)'NaN(8)=',real(z'FFF8',8)
   end
 
 gfortran, even with -std=f2003, claims that the BOZ data is too big.

Do you have an INTEGER(16)?

 Apparently, it is first converting to an UNSIGNED integer, then trying to cast
 to a SIGNED Fortran integer.

Not even close to the truth.

 With F2003, this form of BOZ should do a
 'reinterpret-cast' of raw binary bits directly to the destination type.

gfortran implements the F95 behavior and extensions.  The extension
conflict with F2003.

 Even without the reinterpret cast problem, integer BOZ is not handled
 correctly. This expression also claims the BOZ is too large:
int(z'',8)

Do you have INTEGER(16)?

 Again, it is being intepreted as an UNSIGNED int then static-cast to a signed
 in, thus overflowing.


Not even close to the truth.

 The traditional behavior is for all BOZ to be initially interpreted as the
 largets integer type supported.

Do you have an INTEGER(16)?

 F95 dropped BOZ because of the lame definition

Huh?

 but F2003 brought it back for use mainly within REAL() and INT(),
 which allow the raw initial interpretation in a sensible way.

No, it isn't sensible.  It is *processor dependent*.  Think big
versus little endian to start.  Next consider that F2003 does not
define the underlying floating representation.  This was a very
broken attempt to fix TRANSFER.

 A related problem is that I am trying to create a NaN constant (parameter). I
 can't use REAL+BOZ, but I also cannot define real :: NaN = 0.0/0.0. In this
 case, divide-by-zero is invalid math, but should only be a warning and not an
 error. (I am speaking practically; I don't know what the standards say.)

program rtfm
x = 0. / 0.
end program rtfm

gfc -fno-range-check -o z rtfm.f90


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2007-03-15 Thread sgk at troutmask dot apl dot washington dot edu


--- Comment #8 from sgk at troutmask dot apl dot washington dot edu  
2007-03-16 04:09 ---
Subject: Re:  Warn with -std=f95/f2003 when BOZ is used at invalid places

On Fri, Mar 16, 2007 at 03:53:57AM -, jkrahn at nc dot rr dot com wrote:

 I have not checked F2008 yet. My vote is to just ignore the standards when it
 comes to negative BOZ, the way Intel has done it, which I HOPE is what F2008
 says.

gfortran doesn't have that luxury.  it can't ignore the standard.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2006-10-16 Thread tobias dot burnus at physik dot fu-berlin dot de


--- Comment #1 from tobias dot burnus at physik dot fu-berlin dot de  
2006-10-16 13:34 ---
Note that there is a change in meaning:

BOZ-everywhere extension:
   a = real(z'F')
is the same as  real(int(z'F')) = 15.0
(This is what gfortran does and Intel does by default)

Fortran 2003:
   a = real(z'F')
= 2.1019477E-44


Intel gives a default warning in such cases:

fortcom: Warning: boz2.f90, line 2: The Fortran 2003 Standard will use this bit
pattern directly and NOT convert it to REAL as if it were an INTEGER constant
(try -switch fe_new_BOZ_constants).
   a = real(z'F')
^


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2006-10-16 Thread kargl at gcc dot gnu dot org


--- Comment #2 from kargl at gcc dot gnu dot org  2006-10-16 16:51 ---
This is going to be difficult to fix.  In fact, it will require a
complete rewrite on how BOZ are handled.

 Fortran 2003:
   a = real(z'F')
 = 2.1019477E-44

Are you sure this is the only correct value?  The F2003 says nothing
about the other 28 bits.  It also says nothing about whether z'F'
applies to most significant bits or least significant bits of the
32-bit real.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2006-10-16 Thread tobias dot burnus at physik dot fu-berlin dot de


--- Comment #3 from tobias dot burnus at physik dot fu-berlin dot de  
2006-10-16 17:12 ---
(In reply to comment #2)
  Fortran 2003:
a = real(z'F')
  = 2.1019477E-44
 
 Are you sure this is the only correct value?  The F2003 says nothing
 about the other 28 bits.  It also says nothing about whether z'F'
 applies to most significant bits or least significant bits of the
 32-bit real.

Well, that is the value ifort gave me (using -switch fe_new_BOZ_constants); I
think it is a valid value, but I'm not sure whether it is the only one.

As NAG f95, g95 and sunf95 do not yet support F2003's BOZ, I cannot compare
with what they give. I also found the F2003 standard not so detailed, but maybe
I missed the right spot. Best to ask at comp.lang.fortran.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471



[Bug fortran/29471] Warn with -std=f95/f2003 when BOZ is used at invalid places

2006-10-16 Thread kargl at gcc dot gnu dot org


--- Comment #4 from kargl at gcc dot gnu dot org  2006-10-16 17:23 ---
Forgot to add myself to cc listing.

Tobias, the only place the handling on a BOZ (other the data-stmt handling)
is discussed in the description REAL() intrinsic procedure.  It contains
the dreaded processor-dependent language.


-- 

kargl at gcc dot gnu dot org changed:

   What|Removed |Added

 CC||kargl at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29471