OSDN Git Service

PR fortran/30947
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Aug 2007 23:02:38 +0000 (23:02 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Aug 2007 23:02:38 +0000 (23:02 +0000)
* iresolve.c (gfc_resolve_alarm_sub): Suffix the subroutine name
with the kind of the STATUS argument.

* intrinsics/signal.c: Create specific versions of alarm_sub and
alarm_sub_int according to the integer kind of the last argument.
* gfortran.map (GFORTRAN_1.0): Remove _gfortran_alarm_sub and
_gfortran_alarm_sub_int, add _gfortran_alarm_sub_i4,
_gfortran_alarm_sub_i8, _gfortran_alarm_sub_int_i4 and
_gfortran_alarm_sub_int_i8.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127259 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/iresolve.c
libgfortran/ChangeLog
libgfortran/gfortran.map
libgfortran/intrinsics/signal.c

index 7a80bfd..dc5a09e 100644 (file)
@@ -1,5 +1,11 @@
 2007-08-06  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
+       PR fortran/30947
+       * iresolve.c (gfc_resolve_alarm_sub): Suffix the subroutine name
+       with the kind of the STATUS argument.
+
+2007-08-06  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
        PR fortran/30948
        * intrinsic.c (add_functions): Fix name of argument to CHDIR.
 
index 21ec605..d0a73bf 100644 (file)
@@ -2385,15 +2385,19 @@ gfc_resolve_alarm_sub (gfc_code *c)
   ts.type = BT_INTEGER;
   ts.kind = gfc_c_int_kind;
 
-  /* handler can be either BT_INTEGER or BT_PROCEDURE  */
+  /* handler can be either BT_INTEGER or BT_PROCEDURE.
+     In all cases, the status argument is of default integer kind
+     (enforced in check.c) so that the function suffix is fixed.  */
   if (handler->ts.type == BT_INTEGER)
     {
       if (handler->ts.kind != gfc_c_int_kind)
        gfc_convert_type (handler, &ts, 2);
-      name = gfc_get_string (PREFIX ("alarm_sub_int"));
+      name = gfc_get_string (PREFIX ("alarm_sub_int_i%d"),
+                            gfc_default_integer_kind);
     }
   else
-    name = gfc_get_string (PREFIX ("alarm_sub"));
+    name = gfc_get_string (PREFIX ("alarm_sub_i%d"),
+                          gfc_default_integer_kind);
 
   if (seconds->ts.kind != gfc_c_int_kind)
     gfc_convert_type (seconds, &ts, 2);
index e205466..c7e57db 100644 (file)
@@ -1,5 +1,15 @@
 2007-08-06  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
+       PR fortran/30947
+       * intrinsics/signal.c: Create specific versions of alarm_sub and
+       alarm_sub_int according to the integer kind of the last argument.
+       * gfortran.map (GFORTRAN_1.0): Remove _gfortran_alarm_sub and
+       _gfortran_alarm_sub_int, add _gfortran_alarm_sub_i4,
+       _gfortran_alarm_sub_i8, _gfortran_alarm_sub_int_i4 and
+       _gfortran_alarm_sub_int_i8.
+
+2007-08-06  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
        PR fortran/29828
        * intrinsics/string_intrinsics.c (string_minmax): New function
        and prototype.
index ed881eb..8cfc236 100644 (file)
@@ -4,8 +4,10 @@ GFORTRAN_1.0 {
     _gfortran_access_func;
     _gfortran_adjustl;
     _gfortran_adjustr;
-    _gfortran_alarm_sub;
-    _gfortran_alarm_sub_int;
+    _gfortran_alarm_sub_i4;
+    _gfortran_alarm_sub_i8;
+    _gfortran_alarm_sub_int_i4;
+    _gfortran_alarm_sub_int_i8;
     _gfortran_all_l16;
     _gfortran_all_l4;
     _gfortran_all_l8;
index 2c2f38d..c69efac 100644 (file)
@@ -132,11 +132,11 @@ iexport(signal_func_int);
 
 
 /* ALARM intrinsic with PROCEDURE as handler  */
-extern void alarm_sub (int *, void (*)(int), int *);
-iexport_proto(alarm_sub);
+extern void alarm_sub_i4 (int *, void (*)(int), GFC_INTEGER_4 *);
+iexport_proto(alarm_sub_i4);
 
 void
-alarm_sub (int *seconds, void (*handler)(int), int *status)
+alarm_sub_i4 (int *seconds, void (*handler)(int), GFC_INTEGER_4 *status)
 {
 #if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
   if (status != NULL)
@@ -157,15 +157,71 @@ alarm_sub (int *seconds, void (*handler)(int), int *status)
     *status = -1;
 #endif
 }
-iexport(alarm_sub);
+iexport(alarm_sub_i4);
+
+
+extern void alarm_sub_i8 (int *, void (*)(int), GFC_INTEGER_8 *);
+iexport_proto(alarm_sub_i8);
+
+void
+alarm_sub_i8 (int *seconds, void (*handler)(int), GFC_INTEGER_8 *status)
+{
+#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
+  if (status != NULL)
+    {
+      if (signal (SIGALRM, handler) == SIG_ERR)
+       *status = -1;
+      else
+       *status = alarm (*seconds);
+    }
+  else
+    {
+      signal (SIGALRM, handler);
+      alarm (*seconds);
+    }
+#else
+  errno = ENOSYS;
+  if (status != NULL)
+    *status = -1;
+#endif
+}
+iexport(alarm_sub_i8);
 
 
 /* ALARM intrinsic with INTEGER as handler  */
-extern void alarm_sub_int (int *, int *, int *);
-iexport_proto(alarm_sub_int);
+extern void alarm_sub_int_i4 (int *, int *, GFC_INTEGER_4 *);
+iexport_proto(alarm_sub_int_i4);
+
+void
+alarm_sub_int_i4 (int *seconds, int *handler, GFC_INTEGER_4 *status)
+{
+#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
+  if (status != NULL)
+    {
+      if (signal (SIGALRM, (void (*)(int)) *handler) == SIG_ERR)
+       *status = -1;
+      else
+       *status = alarm (*seconds);
+    }
+  else
+    {
+      signal (SIGALRM, (void (*)(int)) *handler);
+      alarm (*seconds);
+    }
+#else
+  errno = ENOSYS;
+  if (status != NULL)
+    *status = -1;
+#endif
+}
+iexport(alarm_sub_int_i4);
+
+
+extern void alarm_sub_int_i8 (int *, int *, GFC_INTEGER_8 *);
+iexport_proto(alarm_sub_int_i8);
 
 void
-alarm_sub_int (int *seconds, int *handler, int *status)
+alarm_sub_int_i8 (int *seconds, int *handler, GFC_INTEGER_8 *status)
 {
 #if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
   if (status != NULL)
@@ -186,5 +242,5 @@ alarm_sub_int (int *seconds, int *handler, int *status)
     *status = -1;
 #endif
 }
-iexport(alarm_sub_int);
+iexport(alarm_sub_int_i8);