aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2016-07-22 10:38:32 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2016-07-22 10:38:32 +0000
commit1603ebe016da010dcfe264901c4f9a07f9d89e63 (patch)
tree3079ee3a42a7d958ac9f39d6af5f07745081498f /gcc
parentbc91c4361527fb229ad47f20a45de0b3160f2de9 (diff)
downloadgcc-1603ebe016da010dcfe264901c4f9a07f9d89e63.zip
gcc-1603ebe016da010dcfe264901c4f9a07f9d89e63.tar.gz
gcc-1603ebe016da010dcfe264901c4f9a07f9d89e63.tar.bz2
re PR fortran/71795 (Two Bugs in array constructors (optimization))
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/frontend-passes.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/array_constructor_50.f9021
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 54f87d4..ff12b56 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c
index d4dee47..d333c68 100644
--- a/gcc/fortran/frontend-passes.c
+++ b/gcc/fortran/frontend-passes.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 656a6c2..feb3236 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..c22c980
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/array_constructor_50.f90
@@ -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