diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 24a38d26a711..5ab2b98cb059 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -2343,10 +2343,19 @@ gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, gfc_conv_descriptor_elem_len_set (block, dest, span); else if (src_expr->rank != -1 && src_expr->ts.type == BT_CHARACTER - && src_expr->ts.deferred && !element_size_known (dest)) { - tree elem_len = gfc_conv_descriptor_elem_len_get (src); + tree src_desc = src; + if (TREE_CODE (src_desc) == INDIRECT_REF + && DECL_P (TREE_OPERAND (src_desc, 0))) + src_desc = TREE_OPERAND (src_desc, 0); + if (DECL_P (src_desc) + && DECL_LANG_SPECIFIC (src_desc) + && GFC_DECL_SAVED_DESCRIPTOR (src_desc)) + src_desc = GFC_DECL_SAVED_DESCRIPTOR (src_desc); + if (POINTER_TYPE_P (TREE_TYPE (src_desc))) + src_desc = build_fold_indirect_ref_loc (input_location, src_desc); + tree elem_len = gfc_conv_descriptor_elem_len_get (src_desc); gfc_conv_descriptor_elem_len_set (block, dest, elem_len); } diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc index 7c2ec4e14eb5..5c4990bf315e 100644 --- a/gcc/fortran/trans-intrinsic.cc +++ b/gcc/fortran/trans-intrinsic.cc @@ -9903,7 +9903,10 @@ gfc_conv_intrinsic_loc (gfc_se * se, gfc_expr * expr) gfc_conv_expr_reference (se, arg_expr); } else - gfc_conv_array_parameter (se, arg_expr, true, NULL, NULL, NULL); + { + se->bytes_strided = true; + gfc_conv_array_parameter (se, arg_expr, true, NULL, NULL, NULL); + } se->expr = convert (gfc_get_int_type (gfc_index_integer_kind), se->expr); /* Create a temporary variable for loc return value. Without this,