re PR fortran/71795 (Two Bugs in array constructors (optimization))
authorThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 22 Jul 2016 10:38:32 +0000 (10:38 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Fri, 22 Jul 2016 10:38:32 +0000 (10:38 +0000)
2016-07-22  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/71795
* frontend-passes.c (combine_array_constructor):  Don't
do anything if the expression is inside an array iterator.

2016-07-22  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/71795
* gfortran.dg/constructor_50.f90:  New test.

From-SVN: r238638

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

index 54f87d4..ff12b56 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-22  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/71795
+       * frontend-passes.c (combine_array_constructor):  Don't
+       do anything if the expression is inside an array iterator.
+
 2016-07-22  Andre Vehreschild  <vehre@gcc.gnu.org>
 
        * expr.c (gfc_find_stat_co): Fixed whitespaces.
index d4dee47..d333c68 100644 (file)
@@ -1255,6 +1255,11 @@ combine_array_constructor (gfc_expr *e)
   if (forall_level > 0)
     return false;
 
+  /* Inside an iterator, things can get hairy; we are likely to create
+     an invalid temporary variable.  */
+  if (iterator_level > 0)
+    return false;
+
   op1 = e->value.op.op1;
   op2 = e->value.op.op2;
 
index 656a6c2..feb3236 100644 (file)
@@ -1,3 +1,8 @@
+2016-07-22  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/71795
+       * gfortran.dg/constructor_50.f90:  New test.
+
 2016-07-22  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/69028
diff --git a/gcc/testsuite/gfortran.dg/array_constructor_50.f90 b/gcc/testsuite/gfortran.dg/array_constructor_50.f90
new file mode 100644 (file)
index 0000000..c22c980
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do run }
+! PR 71795 - wrong result when putting an array constructor
+! instide an iterator.
+     program test
+
+     implicit none
+     integer :: i,n
+     logical, dimension(1) :: ra
+     logical :: rs
+     integer, allocatable :: a(:)
+
+     allocate ( a(1) )
+
+     n = 1
+     a = 2
+
+     ra = (/ (any(a(i).eq.(/1,2,3/)) ,i=1,n) /)
+     if (.not. all(ra)) call abort
+     rs = any ( (/ (any(a(i).eq.(/1,2,3/)) ,i=1,n) /) )
+     if (.not. rs) call abort
+   end program test