re PR fortran/91943 (ICE in gfc_conv_constant_to_tree, at fortran/trans-const.c:370)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 2 Oct 2019 17:01:30 +0000 (17:01 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 2 Oct 2019 17:01:30 +0000 (17:01 +0000)
2019-10-02  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/91943
* match.c (gfc_match_call): BOZ cannot be an actual argument in
a subroutine reference.
* resolve.c (resolve_function): BOZ cannot be an actual argument in
a function reference.

2019-10-02  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/91943
gfortran.dg/pr91943.f90

From-SVN: r276471

gcc/fortran/ChangeLog
gcc/fortran/match.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr91943.f90 [new file with mode: 0644]

index 51c393a..f225ff2 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-02  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/91943
+       * match.c (gfc_match_call): BOZ cannot be an actual argument in
+       a subroutine reference.
+       * resolve.c (resolve_function): BOZ cannot be an actual argument in
+       a function reference.
 2019-10-01  Jan Hubicka  <jh@suse.cz>
 
        * module.c (load_commons): Initialize flags to 0 to silecne
index 83b1189..4a31080 100644 (file)
@@ -4984,6 +4984,16 @@ gfc_match_call (void)
        goto syntax;
     }
 
+  /* Walk the argument list looking for invalid BOZ.  */
+  for (a = arglist; a; a = a->next)
+    if (a->expr && a->expr->ts.type == BT_BOZ)
+      {
+       gfc_error ("A BOZ literal constant at %L cannot appear as an actual "
+                  "argument in a subroutine reference", &a->expr->where);
+       goto cleanup;
+      }
+
+
   /* If any alternate return labels were found, construct a SELECT
      statement that will jump to the right place.  */
 
index e8d0566..a792547 100644 (file)
@@ -3242,6 +3242,21 @@ resolve_function (gfc_expr *expr)
   if (expr->expr_type != EXPR_FUNCTION)
     return t;
 
+  /* Walk the argument list looking for invalid BOZ.  */
+  if (expr->value.function.esym)
+    {
+      gfc_actual_arglist *a;
+
+      for (a = expr->value.function.actual; a; a = a->next)
+       if (a->expr && a->expr->ts.type == BT_BOZ)
+         {
+           gfc_error ("A BOZ literal constant at %L cannot appear as an "
+                       "actual argument in a function reference",
+                       &a->expr->where);
+           return false;
+         }
+    }
+
   temp = need_full_assumed_size;
   need_full_assumed_size = 0;
 
index d455ce6..3256a02 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-02  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/91943
+       gfortran.dg/pr91943.f90
+
 2019-10-02  Jan Hubicka  <hubicka@ucw.cz>
 
        * g++.dg/tree-ssa/pr53844.C: Add -fno-inline-functions --param
diff --git a/gcc/testsuite/gfortran.dg/pr91943.f90 b/gcc/testsuite/gfortran.dg/pr91943.f90
new file mode 100644 (file)
index 0000000..c2752c5
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+! PR fortran/91943
+! Code contributed by Gerhard Steinmetz
+program p
+   print *, f(b'1001')  ! { dg-error "cannot appear as an actual argument" }
+   call sub(b'1001')    ! { dg-error "cannot appear as an actual argument" }
+end