diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2015-05-12 21:12:55 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2015-05-12 21:12:55 +0000 |
commit | 7e269fe8753df7018b2bcf29fe1bff3e01d09138 (patch) | |
tree | 657a8b7fad116a0c764836088e017f1670366303 /gcc/fortran/frontend-passes.c | |
parent | c3388e62499a6d2f931247a73cabf9184366248e (diff) | |
download | gcc-7e269fe8753df7018b2bcf29fe1bff3e01d09138.zip gcc-7e269fe8753df7018b2bcf29fe1bff3e01d09138.tar.gz gcc-7e269fe8753df7018b2bcf29fe1bff3e01d09138.tar.bz2 |
re PR fortran/66111 (ICE with matmul and vector subscripts)
2015-05-12 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/66111
* frontend-passes.c (has_dimen_vector_ref): New function.
(inline_matmul_assign): Use it to return early in case
of unhandled vector subscripts.
2015-05-12 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/66111
* gfortran.dg/inline_matmul_10.f90: New test.
From-SVN: r223099
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r-- | gcc/fortran/frontend-passes.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 30085e8..a6b5786 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -2680,6 +2680,25 @@ scalarized_expr (gfc_expr *e_in, gfc_expr **index, int count_index) return e; } +/* Helper function to check for a dimen vector as subscript. */ + +static bool +has_dimen_vector_ref (gfc_expr *e) +{ + gfc_array_ref *ar; + int i; + + ar = gfc_find_array_ref (e); + gcc_assert (ar); + if (ar->type == AR_FULL) + return false; + + for (i=0; i<ar->dimen; i++) + if (ar->dimen_type[i] == DIMEN_VECTOR) + return true; + + return false; +} /* Inline assignments of the form c = matmul(a,b). Handle only the cases currently where b and c are rank-two arrays. @@ -2752,6 +2771,10 @@ inline_matmul_assign (gfc_code **c, int *walk_subtrees, || matrix_b->expr_type != EXPR_VARIABLE) return 0; + if (has_dimen_vector_ref (expr1) || has_dimen_vector_ref (matrix_a) + || has_dimen_vector_ref (matrix_b)) + return 0; + if (matrix_a->rank == 2) m_case = matrix_b->rank == 1 ? A2B1 : A2B2; else |