diff options
author | Andre Vehreschild <vehre@gcc.gnu.org> | 2024-07-11 15:44:56 +0200 |
---|---|---|
committer | Andre Vehreschild <vehre@gcc.gnu.org> | 2024-08-19 08:46:43 +0200 |
commit | 661acde60ef4e9ac5a9e48be18770fb3a9aeb9a5 (patch) | |
tree | 215d5150ab5d0290ca312f498863b98200e64082 /gcc | |
parent | 8d6c6fbc5271dde433998c09407b30e2cf195420 (diff) | |
download | gcc-661acde60ef4e9ac5a9e48be18770fb3a9aeb9a5.zip gcc-661acde60ef4e9ac5a9e48be18770fb3a9aeb9a5.tar.gz gcc-661acde60ef4e9ac5a9e48be18770fb3a9aeb9a5.tar.bz2 |
Fix ICE in recompute_tree_invariant_for_addr_expr, at tree.c:4535 [PR84244]
Declaring an unused function with a derived type having a pointer
component and using that derived type as a coarray, lead the compiler to
ICE because the caf_token for the pointer was not linked into the
component correctly.
PR fortran/84244
gcc/fortran/ChangeLog:
* trans-types.cc (gfc_get_derived_type): When a caf_sub_token is
generated for a component, link it to the component it is
generated for (the previous one).
gcc/testsuite/ChangeLog:
* gfortran.dg/coarray/ptr_comp_5.f08: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/trans-types.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/coarray/ptr_comp_5.f08 | 19 |
2 files changed, 24 insertions, 1 deletions
diff --git a/gcc/fortran/trans-types.cc b/gcc/fortran/trans-types.cc index e6da8e1..bc58208 100644 --- a/gcc/fortran/trans-types.cc +++ b/gcc/fortran/trans-types.cc @@ -2661,7 +2661,7 @@ gfc_get_derived_type (gfc_symbol * derived, int codimen) tree *chain = NULL; bool got_canonical = false; bool unlimited_entity = false; - gfc_component *c; + gfc_component *c, *last_c = nullptr; gfc_namespace *ns; tree tmp; bool coarray_flag, class_coarray_flag; @@ -2961,10 +2961,14 @@ gfc_get_derived_type (gfc_symbol * derived, int codimen) types. */ if (class_coarray_flag || !c->backend_decl) c->backend_decl = field; + if (c->attr.caf_token && last_c) + last_c->caf_token = field; if (c->attr.pointer && (c->attr.dimension || c->attr.codimension) && !(c->ts.type == BT_DERIVED && strcmp (c->name, "_data") == 0)) GFC_DECL_PTR_ARRAY_P (c->backend_decl) = 1; + + last_c = c; } /* Now lay out the derived type, including the fields. */ diff --git a/gcc/testsuite/gfortran.dg/coarray/ptr_comp_5.f08 b/gcc/testsuite/gfortran.dg/coarray/ptr_comp_5.f08 new file mode 100644 index 0000000..ed3a8db --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/ptr_comp_5.f08 @@ -0,0 +1,19 @@ +! { dg-do compile } + +! Check PR84244 does not ICE anymore. + +program ptr_comp_5 + integer, target :: dest = 42 + type t + integer, pointer :: p + end type + type(t) :: o[*] + + o%p => dest +contains + ! This unused routine is crucial for the ICE. + function f(x) + type(t), intent(in) ::x + end function +end program + |