re PR fortran/30947 (intrinsic: ALARM)

PR fortran/30947

	* 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.

From-SVN: r127259
This commit is contained in:
Francois-Xavier Coudert 2007-08-06 23:02:38 +00:00 committed by François-Xavier Coudert
parent 52f6c31a52
commit 19c222f890
5 changed files with 91 additions and 13 deletions

View File

@ -1,3 +1,9 @@
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

View 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);

View File

@ -1,3 +1,13 @@
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

View 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;

View 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,43 @@ 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 (int *seconds, int *handler, int *status)
alarm_sub_int_i4 (int *seconds, int *handler, GFC_INTEGER_4 *status)
{
#if defined (SIGALRM) && defined (HAVE_ALARM) && defined (HAVE_SIGNAL)
if (status != NULL)
@ -186,5 +214,33 @@ alarm_sub_int (int *seconds, int *handler, int *status)
*status = -1;
#endif
}
iexport(alarm_sub_int);
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_i8 (int *seconds, int *handler, GFC_INTEGER_8 *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_i8);