+2020-01-30 Paul Thomas <pault@gcc.gnu.org>
+ Jakub Jelinek <jakub@redhat.com>
+
+ PR fortran/92123
+ * trans-decl.c (gfc_get_symbol_decl): Call gfc_defer_symbol_init for
+ CFI descs.
+ (gfc_build_builtin_function_decls): Use ".w." instead of ".ww" or ".wR"
+ for gfor_fndecl_{cfi_to_gfc,gfc_to_cfi}.
+ (convert_CFI_desc): Handle references to CFI descriptors.
+
2020-01-29 Jakub Jelinek <jakub@redhat.com>
PR fortran/93463
sym->ts.u.cl->backend_decl = build_fold_indirect_ref (sym->ts.u.cl->backend_decl);
}
+ if (is_CFI_desc (sym, NULL))
+ gfc_defer_symbol_init (sym);
+
fun_or_res = byref && (sym->attr.result
|| (sym->attr.function && sym->ts.deferred));
if ((sym->attr.dummy && ! sym->attr.function) || fun_or_res)
get_identifier (PREFIX("internal_unpack")), ".wR",
void_type_node, 2, pvoid_type_node, pvoid_type_node);
+ /* These two builtins write into what the first argument points to and
+ read from what the second argument points to, but we can't use R
+ for that, because the directly pointed structure contains a pointer
+ which is copied into the descriptor pointed by the first argument,
+ effectively escaping that way. See PR92123. */
gfor_fndecl_cfi_to_gfc = gfc_build_library_function_decl_with_spec (
- get_identifier (PREFIX("cfi_desc_to_gfc_desc")), ".ww",
+ get_identifier (PREFIX("cfi_desc_to_gfc_desc")), ".w.",
void_type_node, 2, pvoid_type_node, ppvoid_type_node);
gfor_fndecl_gfc_to_cfi = gfc_build_library_function_decl_with_spec (
- get_identifier (PREFIX("gfc_desc_to_cfi_desc")), ".wR",
+ get_identifier (PREFIX("gfc_desc_to_cfi_desc")), ".w.",
void_type_node, 2, ppvoid_type_node, pvoid_type_node);
gfor_fndecl_associated = gfc_build_library_function_decl_with_spec (
while CFI_desc is the descriptor itself. */
if (DECL_LANG_SPECIFIC (sym->backend_decl))
CFI_desc = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
+ else if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (TREE_TYPE (sym->backend_decl))))
+ CFI_desc = sym->backend_decl;
else
CFI_desc = NULL;