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

--- Comment #8 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-08-19 
10:34:13 UTC ---
A simple (partial) revert of the patch of PR 47285
(http://gcc.gnu.org/ml/fortran/2011-01/msg00226.html) will lead to wrong
results as one does not honour the following.

  write(*,'(G5.5E5)') -10000.

will then print "*    " instead of the correct "*****" which is printed
currently. However, due to "w-(e+2) = 5-(5+2) > 0" [where the symbols are:
Gw.dEe], the whole field should be filled with asterisks, cf. below.


I think best is to do a full revert, replace the following hack in the patch
+  if (e > 4)\
+    e = 4;\

by a simply check for w-4 > 0 or w-(e+2) > 0 and - if failing - fill it with
"*" and return. Only when succeeding, move to the FMT_F. In the latter padding
section, one can then always pad with ' '. I have not yet checked whether the
  +  nb = nb >= w ? 0 : nb;\
is then still required or not.


>From the F2008 standard:

"if an exponent exceeds its specified or implied width using the ... G edit
descriptor," [the field should be filled with "*"].

One has for "Gw.d" n = 4 and for "Gw.d.Ee" it is "n = e+2". The requirement is
"w-n > 0". In that case, one needs to fill the whole width w (of "Gw.d") with
asterisks.

If "w-n > 0", one has "F(w-n).(dd),n(' ')" with some "dd" depending on rounding
and magnitude of the value. In that case, only (w-n) is - if needed - filled
with asterisks.

(For the calculations, see 10.7.5.2.2 (below the first table); see also
10.7.2.1 in comment 1 with the interpretation in comment 7.)

Reply via email to