Patchwork Change date_and_time for F03+ (PR fortran/45308)

login
register
mail settings
Submitter Jakub Jelinek
Date Aug. 17, 2010, 5:21 p.m.
Message ID <20100817172111.GH702@tyan-ft48-01.lab.bos.redhat.com>
Download mbox | patch
Permalink /patch/61943/
State New
Headers show

Comments

Jakub Jelinek - Aug. 17, 2010, 5:21 p.m.
Hi!

As reported in the PR, F03 changed date_and_time incompatibly,
instead of setting first 8/10/5 characters of the strings the routine is now
supposed to set the strings.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2010-08-17  Jakub Jelinek  <jakub@redhat.com>

	PR fortran/45308
	* intrinsics/date_and_time.c (date_and_time): Pass __{zone,time,date}_len
	instead of {ZONE,TIME,DATE}_LEN as second argument to fstrcpy.  Drop
	asserts.  Adjust comment to the F2003 wording from the F95 wording.


	Jakub
Tobias Burnus - Aug. 17, 2010, 5:27 p.m.
On 08/17/2010 07:21 PM, Jakub Jelinek wrote:
> As reported in the PR, F03 changed date_and_time incompatibly

For completeness, Richard Maine* does not agree with my reading of 
Fortran 90/95 and claims that it is undefined in Fortran 90/95. But even 
if it were more explicitly defined as keeping the old value, I do not 
think that any program relies on it.

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks for the patch!

Tobias

(* Cf. c.l.f [link in the PR]; Richard Maine was the editor of the 
Fortran 2003 standard and several years in the J3 standard committee.)

> 2010-08-17  Jakub Jelinek<jakub@redhat.com>
>
> 	PR fortran/45308
> 	* intrinsics/date_and_time.c (date_and_time): Pass __{zone,time,date}_len
> 	instead of {ZONE,TIME,DATE}_LEN as second argument to fstrcpy.  Drop
> 	asserts.  Adjust comment to the F2003 wording from the F95 wording.

Patch

--- libgfortran/intrinsics/date_and_time.c.jj	2010-06-07 11:25:15.000000000 +0200
+++ libgfortran/intrinsics/date_and_time.c	2010-08-17 15:44:53.000000000 +0200
@@ -93,29 +93,25 @@  gmtime_r (const time_t * timep, struct t
 
    Arguments:
 
-   DATE (optional) shall be scalar and of type default character, and
-   shall be of length at least 8 in order to contain the complete
-   value. It is an INTENT(OUT) argument. Its leftmost 8 characters
-   are assigned a value of the form CCYYMMDD, where CC is the century,
-   YY the year within the century, MM the month within the year, and
-   DD the day within the month. If there is no date available, they
-   are assigned blanks.
-
-   TIME (optional) shall be scalar and of type default character, and
-   shall be of length at least 10 in order to contain the complete
-   value. It is an INTENT(OUT) argument. Its leftmost 10 characters
-   are assigned a value of the form hhmmss.sss, where hh is the hour
-   of the day, mm is the minutes of the hour, and ss.sss is the
-   seconds and milliseconds of the minute. If there is no clock
-   available, they are assigned blanks.
-
-   ZONE (optional) shall be scalar and of type default character, and
-   shall be of length at least 5 in order to contain the complete
-   value. It is an INTENT(OUT) argument. Its leftmost 5 characters
-   are assigned a value of the form [+-]hhmm, where hh and mm are the
-   time difference with respect to Coordinated Universal Time (UTC) in
-   hours and parts of an hour expressed in minutes, respectively. If
-   there is no clock available, they are assigned blanks.
+   DATE (optional) shall be scalar and of type default character.
+   It is an INTENT(OUT) argument.  It is assigned a value of the
+   form CCYYMMDD, where CC is the century, YY the year within the
+   century, MM the month within the year, and DD the day within the
+   month.  If there is no date available, they are assigned blanks.
+
+   TIME (optional) shall be scalar and of type default character.
+   It is an INTENT(OUT) argument. It is assigned a value of the
+   form hhmmss.sss, where hh is the hour of the day, mm is the
+   minutes of the hour, and ss.sss is the seconds and milliseconds
+   of the minute.  If there is no clock available, they are assigned
+   blanks.
+
+   ZONE (optional) shall be scalar and of type default character.
+   It is an INTENT(OUT) argument.  It is assigned a value of the
+   form [+-]hhmm, where hh and mm are the time difference with
+   respect to Coordinated Universal Time (UTC) in hours and parts
+   of an hour expressed in minutes, respectively.  If there is no
+   clock available, they are assigned blanks.
 
    VALUES (optional) shall be of type default integer and of rank
    one. It is an INTENT(OUT) argument. Its size shall be at least
@@ -311,22 +307,13 @@  date_and_time (char *__date, char *__tim
     }
 
   if (__zone)
-    {
-      assert (__zone_len >= ZONE_LEN);
-      fstrcpy (__zone, ZONE_LEN, zone, ZONE_LEN);
-    }
+    fstrcpy (__zone, __zone_len, zone, ZONE_LEN);
 
   if (__time)
-    {
-      assert (__time_len >= TIME_LEN);
-      fstrcpy (__time, TIME_LEN, timec, TIME_LEN);
-    }
+    fstrcpy (__time, __time_len, timec, TIME_LEN);
 
   if (__date)
-    {
-      assert (__date_len >= DATE_LEN);
-      fstrcpy (__date, DATE_LEN, date, DATE_LEN);
-    }
+    fstrcpy (__date, __date_len, date, DATE_LEN);
 }
 
 
--- gcc/testsuite/gfortran.dg/pr45308.f03.jj	2010-08-17 15:37:27.000000000 +0200
+++ gcc/testsuite/gfortran.dg/pr45308.f03	2010-08-17 15:21:01.000000000 +0200
@@ -0,0 +1,9 @@ 
+! PR fortran/45308
+! { dg-do run }
+ character(len=36) :: date, time
+ date = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+ time = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
+ call date_and_time (date, time)
+ if (index (date, 'a') /= 0 .or. index (time, 'a') /= 0) &
+   call abort
+end