re PR fortran/88008 (ICE in check_typebound_baseobject, at fortran/resolve.c:6058)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 18 Mar 2019 07:28:42 +0000 (07:28 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 18 Mar 2019 07:28:42 +0000 (07:28 +0000)
2019-03-17  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/88008
* gfortran.h (expr_t): Add EXPR_UNKNOWN.
* expr.c (gfc_copy_expr): Add EXPR_UNKNOWN to switch statement.
(gfc_simplify_expr): Likewise.
* module.c (mio_expr): Likewise.
* resovle.c (extract_compcall_passed_object): Issue error on
unknown type.
(check_typebound_baseobject): Issue error on wrong type.
* trans-expr.c (gfc_apply_interface_mapping_to_expr): Add
EXPR_UNKNOWN to switch statement.

2019-03-17  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/88008
 * gfortran.dg/typebound_call_31.f90: New test.

From-SVN: r269750

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/fortran/gfortran.h
gcc/fortran/module.c
gcc/fortran/resolve.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/typebound_call_31.f90 [new file with mode: 0644]

index 762da701b001b29fa2b5ca945abc014606e99ce0..8028118c97cef1988a89c554fec871e40831e416 100644 (file)
@@ -1,3 +1,16 @@
+2019-03-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/88008
+       * gfortran.h (expr_t): Add EXPR_UNKNOWN.
+       * expr.c (gfc_copy_expr): Add EXPR_UNKNOWN to switch statement.
+       (gfc_simplify_expr): Likewise.
+       * module.c (mio_expr): Likewise.
+       * resovle.c (extract_compcall_passed_object): Issue error on
+       unknown type.
+       (check_typebound_baseobject): Issue error on wrong type.
+       * trans-expr.c (gfc_apply_interface_mapping_to_expr): Add
+       EXPR_UNKNOWN to switch statement.
+
 2019-03-16  Jakub Jelinek  <jakub@redhat.com>
 
        PR fortran/89724
index d654f4e74d04fd6b46a1d38f124ecef2520b9fb6..4c76f539031f5b9fc51dbe924e0bbb43efe58cb9 100644 (file)
@@ -390,6 +390,9 @@ gfc_copy_expr (gfc_expr *p)
     case EXPR_VARIABLE:
     case EXPR_NULL:
       break;
+
+    case EXPR_UNKNOWN:
+      gcc_unreachable ();
     }
 
   q->shape = gfc_copy_shape (p->shape, p->rank);
@@ -2206,6 +2209,9 @@ gfc_simplify_expr (gfc_expr *p, int type)
     case EXPR_COMPCALL:
     case EXPR_PPC:
       break;
+
+    case EXPR_UNKNOWN:
+      gcc_unreachable ();
     }
 
   return true;
index dd959e6403ecaf2e76554bec104077a519794441..2f55b9c387a6a9fe86374fbcd339f2e58f7807fb 100644 (file)
@@ -142,7 +142,7 @@ enum gfc_source_form
 
 /* Expression node types.  */
 enum expr_t
-{ EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
+  { EXPR_UNKNOWN = 0, EXPR_OP = 1, EXPR_FUNCTION, EXPR_CONSTANT, EXPR_VARIABLE,
   EXPR_SUBSTRING, EXPR_STRUCTURE, EXPR_ARRAY, EXPR_NULL, EXPR_COMPCALL, EXPR_PPC
 };
 
index 0572b8e02c17aa1e465dd49562c0b0f51024bc8c..0c2699c1260967105bfcea056732904b08f2743a 100644 (file)
@@ -3694,6 +3694,7 @@ mio_expr (gfc_expr **ep)
 
     case EXPR_COMPCALL:
     case EXPR_PPC:
+    case EXPR_UNKNOWN:
       gcc_unreachable ();
       break;
     }
index 62c7d376b92182b67341bf5683285dfc28ec078e..7539aa7038c499694a4fb111ecff548c2c7d0744 100644 (file)
@@ -5945,6 +5945,13 @@ extract_compcall_passed_object (gfc_expr* e)
 {
   gfc_expr* po;
 
+  if (e->expr_type == EXPR_UNKNOWN)
+    {
+      gfc_error ("Error in typebound call at %L",
+                &e->where);
+      return NULL;
+    }
+
   gcc_assert (e->expr_type == EXPR_COMPCALL);
 
   if (e->value.compcall.base_object)
@@ -6090,7 +6097,11 @@ check_typebound_baseobject (gfc_expr* e)
   if (!base)
     return false;
 
-  gcc_assert (base->ts.type == BT_DERIVED || base->ts.type == BT_CLASS);
+  if (base->ts.type != BT_DERIVED && base->ts.type != BT_CLASS)
+    {
+      gfc_error ("Error in typebound call at %L", &e->where);
+      goto cleanup;
+    }
 
   if (base->ts.type == BT_CLASS && !gfc_expr_attr (base).class_ok)
     return false;
index 9575f391abd4fd4681432325456d5aa41eef0f40..3cd2ffa722dd2ee097044d158b62b6c3511d183b 100644 (file)
@@ -4536,6 +4536,7 @@ gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
 
     case EXPR_COMPCALL:
     case EXPR_PPC:
+    case EXPR_UNKNOWN:
       gcc_unreachable ();
       break;
     }
index 131ef49ee6801fa3d30c228572fa991b21354877..ecb996281674216fdae8bccf4f26074de8a3f6f2 100644 (file)
@@ -1,3 +1,8 @@
+2019-03-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/88008
+        * gfortran.dg/typebound_call_31.f90: New test.
+
 2019-03-03-17  John David Anglin  <danglin@gcc.gnu.org>
 
        * gcc.dg/compat/pr83487-1_x.c: Use -fno-common option on hppa*-*-hpux*.
diff --git a/gcc/testsuite/gfortran.dg/typebound_call_31.f90 b/gcc/testsuite/gfortran.dg/typebound_call_31.f90
new file mode 100644 (file)
index 0000000..b33bbf1
--- /dev/null
@@ -0,0 +1,16 @@
+! { dg-do compile }
+! PR 88008 - this use to ICE. Original test case by
+! Gerhard Steinmetz.
+
+module m
+   type t
+      integer, pointer :: z
+   contains
+      procedure :: g
+   end type
+contains
+   subroutine g(x)
+      class(t) :: x
+      call x%z%g()  ! { dg-error "Error in typebound call" }
+   end
+end