Hi Jerry!

On 2/2/26 06:09, Jerry D wrote:
Attached patch fixes everything so far.

See my annotations below.

-- Jerry

On 2/1/26 3:00 PM, Jerry D wrote:
On 2/1/26 12:44 PM, Harald Anlauf wrote:
Hi Jerry,

thanks for your draft patch!

I don't mind implementing it step by step, but it does not
work here as I think it should (based on two other compilers).

Let's look at the testcases first:

- real(10) should be restricted to platforms where this is
   available; it will be rejected on several others

I found one compiler that did not support real(10) even though the hardware has it and it did support real(16). Some don't do either. I am certain we need to set target in the test cases

I meant: do all platforms which *we* support implement real(10)?
You could

% grep -r __GFC_REAL_10__ gcc/testsuite/gfortran.dg/

for similar solutions.


- EXformat_1.f90

   r4 = -huge(1.0_4/3.0_4)

this is identical to

   r4 = -huge(1.0_4)

Fixed


Yes, I will tweak that.

and should print as:

-0XF.FFFFFP+124


Fixed (note system dependent on the first hex digit):

   write(s1,"(EX0.0,'<')") r4
   if (s1.ne."-0X1.FFFFFEP+127<") stop 1
   write(s1,"(EX0.0,'<')") r8
   if (s1.ne."-0X1.FFFFFFFFFFFFFP+1023<") stop 2
   write(s1,"(EX0.0,'<')") r10
   if (s1.ne."-0XF.FFFFFFFFFFFFFFFP+16380<") stop 3

Let's see:

13.7.2.3.6 EX editing

The EXw.d and EXw.dEe edit descriptors indicate that the external field
occupies w positions, except when w is zero in which case the processor
selects the field width. The fractional part of the field contains d
hexadecimal digits, except when d is zero in which case the processor
selects the number of hexadecimal digits to be the minimum required so
that the output field is equal to the internal value; ...

But -0XF.FFFFFP+124 is shorter than -0X1.FFFFFEP+127, so I think
you should recheck.  Sorry for the extra work ;-)


and not

-0X1.P+127


hmm, I Added an = sign in a conditional looking at something else and forgot
to take it back out.

   /* Handle the 'd' parameter - adjust mantissa precision if specified */
   if (d > 0)      <---------- I had >=, my bad.
     {


This gives:

123456789012345678901234567890
-0X1.FFFFFEP+127<
-0X1.FFFFFFFFFFFFFP+1023<
-0XF.FFFFFFFFFFFFFFFP+16380<

Notice how this implementation normalizes differently then others.

etc.

Similarly for EXformat_2.f90, the first write should be

  >          -0X9.D14707B63DFBP+3<


Fixed and now:

   write(str1, '(">",EX30.0,"<")') num
   if (str1.ne.">         -0X1.3A28E0F6C7BF6P+6<") stop 1

Also system dependent, compiler dependent.

and not

  >                      -0X1.P+6<

Likwise, thanks for seeing these.


I would also recommend to extend the string length s1 so that
other brands do not complain about it being to short:

   character(kind=1, len=16) :: s1


Easy to do.


Fixed to len=45

I also get a warning at compilation of io.cc:

../../gcc-trunk/gcc/fortran/io.cc: In function 'format_token format_lex()': ../../gcc-trunk/gcc/fortran/io.cc:449:11: warning: this statement may fall through [-Wimplicit-fallthrough=]
   449 |           switch (c)
       |           ^~~~~~
../../gcc-trunk/gcc/fortran/io.cc:464:9: note: here
   464 |         case 'Z':
       |         ^~~~

Can you check the logic?

Found it and fixed, missed a ' break; '

If we didn't find it, one of the testers would complain later..



Yes, I did not see it fly by, but will check.


I stopped the review here.

Feel free to continue.


Finally a few general comments: please try to stick to the
80 columns/line recommendation for commit messages as well
as for code.


I went through and fixed line lengths.


Agree, I can adjust.

Thanks for that.

We're getting closer...  Eagerly waiting for version 3 ;-)

Best,
Harald



Best,
Harald
--- snip ---

Thanks for the review.  I will fix these and resubmit.

Jerry



Reply via email to