aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2019-09-13 20:19:40 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2019-09-13 20:19:40 +0000
commit81e87db49d7919327d709c4b608990be7ab3b862 (patch)
tree0d53612a800f14f365f414313483f9e70d06d92b /gcc
parentc28712beb41d67b0aa5cbd389ade768dcbd961da (diff)
downloadgcc-81e87db49d7919327d709c4b608990be7ab3b862.zip
gcc-81e87db49d7919327d709c4b608990be7ab3b862.tar.gz
gcc-81e87db49d7919327d709c4b608990be7ab3b862.tar.bz2
re PR fortran/91566 (ICE in gfc_constructor_copy, at fortran/constructor.c:103)
2019-09-13 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/91566 * simplify.c (gfc_simplify_merge): Need to simplify expression after insertation of parenthesis. 2019-09-13 Steven G. Kargl <kargl@gcc.gnu.org> PR fortran/91566 * gfortran.dg/pr91566.f90: From-SVN: r275704
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/simplify.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr91566.f9014
4 files changed, 32 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index a396418..6f2ba75 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-13 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/91566
+ * simplify.c (gfc_simplify_merge): Need to simplify expression
+ after insertation of parenthesis.
+
2019-09-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR fortran/91716
diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c
index 023eedb..3d2fc0d 100644
--- a/gcc/fortran/simplify.c
+++ b/gcc/fortran/simplify.c
@@ -4780,8 +4780,13 @@ gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
if (mask->expr_type == EXPR_CONSTANT)
- return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
- ? tsource : fsource));
+ {
+ result = gfc_copy_expr (mask->value.logical ? tsource : fsource);
+ /* Parenthesis is needed to get lower bounds of 1. */
+ result = gfc_get_parentheses (result);
+ gfc_simplify_expr (result, 1);
+ return result;
+ }
if (!mask->rank || !is_constant_array_expr (mask)
|| !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 62766c2..8bb7e7a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-13 Steven G. Kargl <kargl@gcc.gnu.org>
+
+ PR fortran/91566
+ * gfortran.dg/pr91566.f90:
+
2019-09-13 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR fortran/91716
diff --git a/gcc/testsuite/gfortran.dg/pr91566.f90 b/gcc/testsuite/gfortran.dg/pr91566.f90
new file mode 100644
index 0000000..fdb35b4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr91566.f90
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! Code contributed by Gerhard Steinmetz
+program p
+ call q
+ call r
+end program p
+
+subroutine q
+ print *, -merge([3,4], 0, [.false.,.true.])
+end
+
+subroutine r
+ print *, 2 + merge([3,4], 0, [.false.,.true.])
+end