aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2024-07-11 15:44:56 +0200
committerAndre Vehreschild <vehre@gcc.gnu.org>2024-08-19 08:46:43 +0200
commit661acde60ef4e9ac5a9e48be18770fb3a9aeb9a5 (patch)
tree215d5150ab5d0290ca312f498863b98200e64082 /gcc
parent8d6c6fbc5271dde433998c09407b30e2cf195420 (diff)
downloadgcc-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.cc6
-rw-r--r--gcc/testsuite/gfortran.dg/coarray/ptr_comp_5.f0819
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
+