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

--- Comment #11 from kargl at gcc dot gnu.org ---
(In reply to kargl from comment #10)
> The non-standard SLEEP intrinsic subroutine is documented as taking a
> default integer argument.  This patch enforces this restriction.
> 
> Index: gcc/fortran/check.c
> ===================================================================
> --- gcc/fortran/check.c       (revision 280157)
> +++ gcc/fortran/check.c       (working copy)
> @@ -5588,6 +5588,9 @@ gfc_check_sleep_sub (gfc_expr *seconds)
>    if (!scalar_check (seconds, 0))
>      return false;
>  
> +  if (!kind_value_check (seconds, 0, gfc_default_integer_kind))
> +   return false;
> +
>    return true;
>  }

Perhaps, a better patch.  This effectively makes SLEEP a generic
procedure by converting the SECONDS argument to default integer
kind.

Index: gcc/fortran/iresolve.c
===================================================================
--- gcc/fortran/iresolve.c      (revision 280157)
+++ gcc/fortran/iresolve.c      (working copy)
@@ -3699,14 +3699,19 @@ void
 gfc_resolve_sleep_sub (gfc_code *c)
 {
   const char *name;
-  int kind;
+  gfc_typespec ts;
+  gfc_expr *n;
+  gfc_clear_ts (&ts);

-  if (c->ext.actual->expr != NULL)
-    kind = c->ext.actual->expr->ts.kind;
-  else
-    kind = gfc_default_integer_kind;
+  /* The argument to SLEEP has to be of default kind.  If it is not,
+     we convert it.  */
+  ts.type = BT_INTEGER;
+  ts.kind = gfc_default_integer_kind;
+  n = c->ext.actual->expr;
+  if (n != NULL && n->ts.kind != ts.kind)
+    gfc_convert_type (n, &ts, 2);

-  name = gfc_get_string (PREFIX ("sleep_i%d_sub"), kind);
+  name = gfc_get_string (PREFIX ("sleep_i%d_sub"), ts.kind);
   c->resolved_sym = gfc_get_intrinsic_sub_symbol (name);
 }

Index: gcc/fortran/intrinsic.texi
===================================================================
--- gcc/fortran/intrinsic.texi  (revision 280157)
+++ gcc/fortran/intrinsic.texi  (working copy)
@@ -13557,7 +13557,8 @@ Subroutine

 @item @emph{Arguments}:
 @multitable @columnfractions .15 .70
-@item @var{SECONDS} @tab The type shall be of default @code{INTEGER}.
+@item @var{SECONDS} @tab @var{SECONDS} shall be scalar with an
+@code{INTEGER} type.
 @end multitable

 @item @emph{Example}:

Reply via email to