https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64432

--- Comment #11 from Harald Anlauf <anlauf at gmx dot de> ---
(In reply to Harald Anlauf from comment #10)
> Created attachment 34374 [details]
> Partial patch to handle proposed behavior of system_clock

The patch in comment #10 is a way to produce behavior similar
to Intel:

- every argument to SYSTEM_CLOCK is treated separately and independently
- tested with integer(4), integer(8) and also real(4/8) for count_rate

Note that:
- it is imcomplete, ugly
- inefficient (calls _gfortran_system_clock_ for each present argument)
- does not handle integer(1) and integer(2) properly
- needs cleanup

It works for me.  I.e., for

% cat gfcbug128d.f90
program gfcbug128d
  integer(4) :: count_rate_i4, count_max_i4
  integer(8) :: count_rate_i8, count_max_i8
  real(4)    :: count_rate_r4 = 0
  real(8)    :: count_rate_r8 = 0

  call system_clock (count_max=count_max_i4)
  call system_clock (count_rate=count_rate_i4)
  call system_clock (count_rate=count_rate_r4)
  print *, count_max_i4, count_rate_i4, count_rate_r4
  call system_clock (count_rate=count_rate_i4,count_max=count_max_i4)
  print *, count_max_i4, count_rate_i4
  call system_clock (count_rate=count_rate_r4,count_max=count_max_i4)
  print *, count_max_i4, count_rate_r4
  print *
  call system_clock (count_max=count_max_i8)
  call system_clock (count_rate=count_rate_i8)
  call system_clock (count_rate=count_rate_r8)
  print *, count_max_i8, count_rate_i8, count_rate_r8
  call system_clock (count_rate=count_rate_i8,count_max=count_max_i8)
  print *, count_max_i8, count_rate_i8
  call system_clock (count_rate=count_rate_r8,count_max=count_max_i8)
  print *, count_max_i8, count_rate_r8
  print *
  call system_clock (count_rate=count_rate_i4,count_max=count_max_i8)
  print *, count_max_i8, count_rate_i4
  call system_clock (count_rate=count_rate_r4,count_max=count_max_i8)
  print *, count_max_i8, count_rate_r4
  print *
  call system_clock (count_rate=count_rate_i8,count_max=count_max_i4)
  print *, count_max_i4, count_rate_i8
  call system_clock (count_rate=count_rate_r8,count_max=count_max_i4)
  print *, count_max_i4, count_rate_r8
end

it produces:
  2147483647        1000   1000.00000    
  2147483647        1000
  2147483647   1000.00000    

  9223372036854775807              1000000   1000000.0000000000     
  9223372036854775807              1000000
  9223372036854775807   1000000.0000000000     

  9223372036854775807        1000
  9223372036854775807   1000.00000    

  2147483647              1000000
  2147483647   1000000.0000000000     

:-)

Reply via email to