aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDaniel Franke <franke.daniel@gmail.com>2008-01-25 16:55:47 -0500
committerDaniel Franke <dfranke@gcc.gnu.org>2008-01-25 16:55:47 -0500
commit42cd23cb280140a88f5ca1e6eec26c4aab734a84 (patch)
tree3ba33c622a4fe8a006e1ca2101a2dec278009729 /gcc
parent3725c0cab37a26f998242bcff23b4b0fdc900de5 (diff)
downloadgcc-42cd23cb280140a88f5ca1e6eec26c4aab734a84.zip
gcc-42cd23cb280140a88f5ca1e6eec26c4aab734a84.tar.gz
gcc-42cd23cb280140a88f5ca1e6eec26c4aab734a84.tar.bz2
re PR fortran/34661 (ice on where / ASSIGNMENT(=))
gcc/fortran: 2008-01-25 Daniel Franke <franke.daniel@gmail.com> PR fortran/34661 * resolve.c (resolve_where): Added check if user-defined assignment operator is an elemental subroutine. (gfc_resolve_where_code_in_forall): Likewise. gcc/testsuite: 2008-01-25 Daniel Franke <franke.daniel@gmail.com> PR fortran/34661 * gfortran.dg/where_operator_assign_4.f90: New test. From-SVN: r131845
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/resolve.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/where_operator_assign_4.f9030
4 files changed, 48 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 8d705f8..6860244 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2008-01-25 Daniel Franke <franke.daniel@gmail.com>
+
+ PR fortran/34661
+ * resolve.c (resolve_where): Added check if user-defined assignment
+ operator is an elemental subroutine.
+ (gfc_resolve_where_code_in_forall): Likewise.
+
2008-01-24 Daniel Franke <franke.daniel@gmail.com>
PR fortran/33375
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 38f8e64..833fd27 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -5656,6 +5656,9 @@ resolve_where (gfc_code *code, gfc_expr *mask)
case EXEC_ASSIGN_CALL:
resolve_call (cnext);
+ if (!cnext->resolved_sym->attr.elemental)
+ gfc_error("Non-ELEMETAL user-defined assignment in WHERE at %L",
+ &cnext->ext.actual->expr->where);
break;
/* WHERE or WHERE construct is part of a where-body-construct */
@@ -5738,6 +5741,9 @@ gfc_resolve_where_code_in_forall (gfc_code *code, int nvar,
/* WHERE operator assignment statement */
case EXEC_ASSIGN_CALL:
resolve_call (cnext);
+ if (!cnext->resolved_sym->attr.elemental)
+ gfc_error("Non-ELEMETAL user-defined assignment in WHERE at %L",
+ &cnext->ext.actual->expr->where);
break;
/* WHERE or WHERE construct is part of a where-body-construct */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9c7af4e..0ea5119 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-25 Daniel Franke <franke.daniel@gmail.com>
+
+ PR fortran/34661
+ * gfortran.dg/where_operator_assign_4.f90: New test.
+
2008-01-25 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/builtin-inf-1.c, gcc.dg/compare6.c, gcc.dg/sibcall-3.c,
diff --git a/gcc/testsuite/gfortran.dg/where_operator_assign_4.f90 b/gcc/testsuite/gfortran.dg/where_operator_assign_4.f90
new file mode 100644
index 0000000..4cf14b2
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/where_operator_assign_4.f90
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! PR fortran/34661 ICE on user-defined assignments in where statements
+! Testcase contributed by Joost VandeVondele
+
+MODULE M1
+ IMPLICIT NONE
+ TYPE T1
+ INTEGER :: I
+ END TYPE T1
+ INTERFACE ASSIGNMENT(=)
+ MODULE PROCEDURE S1
+ END INTERFACE
+CONTAINS
+ SUBROUTINE S1(I,J)
+ TYPE(T1), INTENT(OUT) :: I(2)
+ TYPE(T1), INTENT(IN) :: J(2)
+ I%I=-J%I
+ END SUBROUTINE S1
+END MODULE M1
+
+USE M1
+TYPE(T1) :: I(2),J(2)
+I(:)%I=1
+WHERE (I(:)%I>0)
+ J=I ! { dg-error "Non-ELEMETAL user-defined assignment in WHERE" }
+END WHERE
+
+WHERE (I(:)%I>0) J=I ! { dg-error "Non-ELEMETAL user-defined assignment in WHERE" }
+
+END