aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/frontend-passes.c
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2017-08-27 08:01:25 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2017-08-27 08:01:25 +0000
commit86e03ef911346681949ae6812d64569008936fb4 (patch)
tree91fe0569ab27e4985cfd4554d4d5c9f1abb3998b /gcc/fortran/frontend-passes.c
parent3e7b89acd72eefe7097825a9a06f74913dcf0d03 (diff)
downloadgcc-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.c21
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;