re PR fortran/83540 (Invalid code with MATMUL, -fno-realloc-lhs -ffrontend-optimize)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 26 Dec 2017 23:29:20 +0000 (23:29 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 26 Dec 2017 23:29:20 +0000 (23:29 +0000)
2017-12-26  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/83540
* frontend-passes.c (create_var): If an array to be created
has unknown size and -fno-realloc-lhs is in effect,
return NULL.

2017-12-26  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/83540
* gfortran.dg/inline_matmul_20.f90: New test.

From-SVN: r256003

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/inline_matmul_20.f90 [new file with mode: 0644]

index d0cbc37bf93aa4fd54b2c09f5f574d98465fb5d0..c28f4fee6f304adb1ed5278f5ac085d1e6615dd2 100644 (file)
@@ -1,3 +1,10 @@
+2017-12-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/83540
+       * frontend-passes.c (create_var): If an array to be created
+       has unknown size and -fno-realloc-lhs is in effect,
+       return NULL.
+
 2017-12-22  Bernhard Reutner-Fischer  <aldot@gcc.gnu.org>
             Eric Botcazou  <ebotcazou@adacore.com>
 
index 33820585c868f56d2ecb3b0186ba40d2df9ba3b3..7c515f63b19c68dd2f428fb0092b88b2d61e941e 100644 (file)
@@ -720,6 +720,11 @@ create_var (gfc_expr * e, const char *vname)
   if (e->expr_type == EXPR_CONSTANT || is_fe_temp (e))
     return gfc_copy_expr (e);
 
+  /* Creation of an array of unknown size requires realloc on assignment.
+     If that is not possible, just return NULL.  */
+  if (flag_realloc_lhs == 0 && e->rank > 0 && e->shape == NULL)
+    return NULL;
+
   ns = insert_block ();
 
   if (vname)
index e43e9ed1797d9267415d8f73db98c4235a5befc2..14e8e3f03701608a117788c8b2a837db6b3eb9d4 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-26  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/83540
+       * gfortran.dg/inline_matmul_20.f90: New test.
+
 2017-12-26  Tom de Vries  <tom@codesourcery.com>
 
        * c-c++-common/unroll-5.c: Use relative line number.
diff --git a/gcc/testsuite/gfortran.dg/inline_matmul_20.f90 b/gcc/testsuite/gfortran.dg/inline_matmul_20.f90
new file mode 100644 (file)
index 0000000..0f8728a
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do  run }
+! { dg-additional-options "-fno-realloc-lhs -ffrontend-optimize" }
+! This used to segfault at runtime.
+! Original test case by Harald Anlauf.
+program gfcbug142
+  implicit none
+  real, allocatable :: b(:,:)
+  integer :: n = 5
+  character(len=20) :: line
+  allocate (b(n,n))
+  call random_number (b)
+  write (unit=line,fmt='(2I5)') shape (matmul (b, transpose (b)))
+  if (line /= '    5    5') call abort
+end program gfcbug142