Fortran: fix ICE in check_host_association [PR108544]
authorHarald Anlauf <anlauf@gmx.de>
Wed, 25 Jan 2023 21:47:26 +0000 (22:47 +0100)
committerHarald Anlauf <anlauf@gmx.de>
Thu, 26 Jan 2023 18:25:44 +0000 (19:25 +0100)
gcc/fortran/ChangeLog:

PR fortran/108544
* resolve.cc (check_host_association): Extend host association check
so that it is not restricted to functions.  Also prevent NULL pointer
dereference.

gcc/testsuite/ChangeLog:

PR fortran/108544
* gfortran.dg/pr108544.f90: New test.
* gfortran.dg/pr96102b.f90: New test.

gcc/fortran/resolve.cc
gcc/testsuite/gfortran.dg/pr108544.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr96102b.f90 [new file with mode: 0644]

index 94213cd..9e2edf7 100644 (file)
@@ -6087,7 +6087,6 @@ check_host_association (gfc_expr *e)
       gfc_find_symbol (e->symtree->name, gfc_current_ns, 1, &sym);
 
       if (sym && old_sym != sym
-             && sym->ts.type == old_sym->ts.type
              && sym->attr.flavor == FL_PROCEDURE
              && sym->attr.contained)
        {
@@ -6132,6 +6131,9 @@ check_host_association (gfc_expr *e)
                  return false;
                }
 
+             if (ref == NULL)
+               return false;
+
              gcc_assert (ref->type == REF_ARRAY);
 
              /* Grab the start expressions from the array ref and
diff --git a/gcc/testsuite/gfortran.dg/pr108544.f90 b/gcc/testsuite/gfortran.dg/pr108544.f90
new file mode 100644 (file)
index 0000000..783cb7a
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! PR fortran/108544 - ICE in check_host_association
+! Contributed by G.Steinmetz
+
+module m
+contains
+  subroutine s
+    select type (s => 1) ! { dg-error "Selector shall be polymorphic" }
+    end select
+  end
+end
diff --git a/gcc/testsuite/gfortran.dg/pr96102b.f90 b/gcc/testsuite/gfortran.dg/pr96102b.f90
new file mode 100644 (file)
index 0000000..82147da
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+!
+! PR fortran/108544 - host association
+! Variation of testcase pr96102.f90 using subroutines instead of functions
+
+module m
+  type mytype
+    integer :: i
+  end type
+  type(mytype) :: d = mytype (42) ! { dg-error "is host associated" }
+  integer      :: n = 2           ! { dg-error "is host associated" }
+contains
+  subroutine s
+    if ( n   /= 0 ) stop 1  ! { dg-error "internal procedure of the same name" }
+    if ( d%i /= 0 ) stop 2  ! { dg-error "internal procedure of the same name" }
+  contains
+    subroutine n()
+    end
+    subroutine d()
+    end
+  end
+end
+
+! { dg-prune-output "Operands of comparison operator" }