aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2024-09-24 14:30:52 +0200
committerAndre Vehreschild <vehre@gcc.gnu.org>2024-10-17 08:56:59 +0200
commite32fff675c3bb040fa79854f6b0654c16bc38997 (patch)
tree32ab1e8ec2a6df108c91ba97aadc2889926caa67 /gcc/fortran
parent6293272e9a47e6e7debe4acd8195a2ae2d9ef0df (diff)
downloadgcc-e32fff675c3bb040fa79854f6b0654c16bc38997.zip
gcc-e32fff675c3bb040fa79854f6b0654c16bc38997.tar.gz
gcc-e32fff675c3bb040fa79854f6b0654c16bc38997.tar.bz2
Fix ICE with coarrays and submodules [PR80235]
Exposing a variable in a module and referencing it in a submodule made the compiler ICE, because the external variable was not sorted into the correct module. In fact the module name was not set where the variable got built. gcc/fortran/ChangeLog: PR fortran/80235 * trans-decl.cc (gfc_build_qualified_array): Make sure the array is associated to the correct module and being marked as extern. gcc/testsuite/ChangeLog: * gfortran.dg/coarray/add_sources/submodule_1_sub.f90: New test. * gfortran.dg/coarray/submodule_1.f90: New test.
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/trans-decl.cc7
1 files changed, 5 insertions, 2 deletions
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 56b6202..9cced7c 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -1066,7 +1066,8 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym)
IDENTIFIER_POINTER (gfc_sym_mangled_identifier (sym))));
token = build_decl (DECL_SOURCE_LOCATION (decl), VAR_DECL, token_name,
token_type);
- if (sym->attr.use_assoc)
+ if (sym->attr.use_assoc
+ || (sym->attr.host_assoc && sym->attr.used_in_submodule))
DECL_EXTERNAL (token) = 1;
else
TREE_STATIC (token) = 1;
@@ -1091,9 +1092,11 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym)
if (sym->module && !sym->attr.use_assoc)
{
+ module_htab_entry *mod
+ = cur_module ? cur_module : gfc_find_module (sym->module);
pushdecl (token);
DECL_CONTEXT (token) = sym->ns->proc_name->backend_decl;
- gfc_module_add_decl (cur_module, token);
+ gfc_module_add_decl (mod, token);
}
else if (sym->attr.host_assoc
&& TREE_CODE (DECL_CONTEXT (current_function_decl))