diff options
author | Daniel Franke <franke.daniel@gmail.com> | 2008-01-25 16:55:47 -0500 |
---|---|---|
committer | Daniel Franke <dfranke@gcc.gnu.org> | 2008-01-25 16:55:47 -0500 |
commit | 42cd23cb280140a88f5ca1e6eec26c4aab734a84 (patch) | |
tree | 3ba33c622a4fe8a006e1ca2101a2dec278009729 /gcc | |
parent | 3725c0cab37a26f998242bcff23b4b0fdc900de5 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/where_operator_assign_4.f90 | 30 |
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 |