diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-08-27 08:01:25 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2017-08-27 08:01:25 +0000 |
commit | 86e03ef911346681949ae6812d64569008936fb4 (patch) | |
tree | 91fe0569ab27e4985cfd4554d4d5c9f1abb3998b /gcc/fortran/frontend-passes.c | |
parent | 3e7b89acd72eefe7097825a9a06f74913dcf0d03 (diff) | |
download | gcc-86e03ef911346681949ae6812d64569008936fb4.zip gcc-86e03ef911346681949ae6812d64569008936fb4.tar.gz gcc-86e03ef911346681949ae6812d64569008936fb4.tar.bz2 |
re PR fortran/81974 (ICE verify_gimple failed type mismatch in binary expression)
2017-08-27 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81974
* frontend-passes (inline_matumul_assign): Explicity
set typespec for call to CONJG.
2017-08-27 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/81974
* gfortran.dg/inline_matmul_19.f90: New test.
From-SVN: r251368
Diffstat (limited to 'gcc/fortran/frontend-passes.c')
-rw-r--r-- | gcc/fortran/frontend-passes.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 7a3d027..2631849 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -3837,14 +3837,25 @@ inline_matmul_assign (gfc_code **c, int *walk_subtrees, gcc_unreachable(); } + /* Build the conjg call around the variables. Set the typespec manually + because gfc_build_intrinsic_call sometimes gets this wrong. */ if (conjg_a) - ascalar = gfc_build_intrinsic_call (ns, GFC_ISYM_CONJG, "conjg", - matrix_a->where, 1, ascalar); + { + gfc_typespec ts; + ts = matrix_a->ts; + ascalar = gfc_build_intrinsic_call (ns, GFC_ISYM_CONJG, "conjg", + matrix_a->where, 1, ascalar); + ascalar->ts = ts; + } if (conjg_b) - bscalar = gfc_build_intrinsic_call (ns, GFC_ISYM_CONJG, "conjg", - matrix_b->where, 1, bscalar); - + { + gfc_typespec ts; + ts = matrix_b->ts; + bscalar = gfc_build_intrinsic_call (ns, GFC_ISYM_CONJG, "conjg", + matrix_b->where, 1, bscalar); + bscalar->ts = ts; + } /* First loop comes after the zero assignment. */ assign_zero->next = do_1; |