diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2024-09-24 14:30:52 +0200 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2024-10-17 08:56:59 +0200 |
commit | e32fff675c3bb040fa79854f6b0654c16bc38997 (patch) | |
tree | 32ab1e8ec2a6df108c91ba97aadc2889926caa67 /gcc/fortran | |
parent | 6293272e9a47e6e7debe4acd8195a2ae2d9ef0df (diff) | |
download | gcc-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.cc | 7 |
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)) |