re PR fortran/86372 (Segfault on ASSOCIATE statement with CHARACTER variable)
authorPaul Thomas <pault@gcc.gnu.org>
Mon, 8 Oct 2018 09:11:03 +0000 (09:11 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Mon, 8 Oct 2018 09:11:03 +0000 (09:11 +0000)
2018-10-08  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/86372
* trans-stmt.c (trans_associate_var): Character associate names
with variable string length do not have to be deferred length
for the string length to be set, if variable.

2018-10-08  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/86372
* gfortran.dg/associate_41.f90: New test.

From-SVN: r264915

gcc/fortran/trans-stmt.c
gcc/testsuite/gfortran.dg/associate_41.f90 [new file with mode: 0644]

index ef9e519adc8b6c5407efabf208711270bad9486d..6256e3fa805f699c6330f2a8cfe1024670500f01 100644 (file)
@@ -1885,7 +1885,6 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block *block)
        }
 
       if (sym->ts.type == BT_CHARACTER
-         && sym->ts.deferred
          && !sym->attr.select_type_temporary
          && VAR_P (sym->ts.u.cl->backend_decl)
          && se.string_length != sym->ts.u.cl->backend_decl)
diff --git a/gcc/testsuite/gfortran.dg/associate_41.f90 b/gcc/testsuite/gfortran.dg/associate_41.f90
new file mode 100644 (file)
index 0000000..9177582
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do run }
+!
+! Test the fix for PR86372 in which the associate name string length was
+! not being set, thereby causing a segfault.
+!
+! Contributed by Janus Weil  <janus@gcc.gnu.org>
+!
+program xxx
+
+   character(len=50) :: s
+
+   s = repeat ('*', len(s))
+   call sub(s)
+   if (s .ne. '**'//'123'//repeat ('*', len(s) - 5)) stop 1
+
+contains
+
+   subroutine sub(str)
+      character(len=*), intent(inout) :: str
+      associate (substr => str(3:5))
+         substr = '123'
+      end associate
+   end subroutine
+
+end