for (; to_cm; to_cm = to_cm->next, from_cm = from_cm->next)
{
to_cm->backend_decl = from_cm->backend_decl;
- if (from_cm->ts.type == BT_DERIVED)
+ if (!from_cm->pointer && from_cm->ts.type == BT_DERIVED)
gfc_get_derived_type (to_cm->ts.derived);
else if (from_cm->ts.type == BT_CHARACTER)
--- /dev/null
+! { dg-do compile }
+! Tests the fix for PR31550 in which pointers to derived type components
+! were being TREE-SSA declared in the wrong order and so in the incorrect
+! context.
+!
+! Contributed by Daniel Franke <dfranke@gcc.gnu.org>
+!
+MODULE class_dummy_atom_types\r
+TYPE :: dummy_atom_list\r
+ TYPE(dummy_atom), DIMENSION(:), POINTER :: table\r
+ INTEGER :: nused\r
+END TYPE\r
+\r
+TYPE :: dummy_atom\r
+ TYPE(dummy_atom_private), POINTER :: p\r
+END TYPE\r
+\r
+TYPE :: dummy_atom_private\r
+ TYPE(dummy_atom_list) :: neighbours\r
+END TYPE\r
+END MODULE\r
+\r
+MODULE class_dummy_atom_list\r
+USE class_dummy_atom_types, ONLY: dummy_atom_list\r
+\r
+INTERFACE \r
+ SUBROUTINE dummy_atom_list_init_copy(this, other)\r
+ USE class_dummy_atom_types, ONLY: dummy_atom_list\r
+ TYPE(dummy_atom_list), INTENT(out) :: this\r
+ TYPE(dummy_atom_list), INTENT(in) :: other\r
+ END SUBROUTINE\r
+END INTERFACE\r
+\r
+INTERFACE\r
+ SUBROUTINE dummy_atom_list_merge(this, other)\r
+ USE class_dummy_atom_types, ONLY: dummy_atom_list\r
+ TYPE(dummy_atom_list), INTENT(inout) :: this\r
+ TYPE(dummy_atom_list), INTENT(in) :: other\r
+ END SUBROUTINE\r
+END INTERFACE\r
+END MODULE\r
+\r
+SUBROUTINE dummy_atom_list_init_copy(this, other)\r
+ USE class_dummy_atom_list, ONLY: dummy_atom_list, dummy_atom_list_merge\r
+\r
+ TYPE(dummy_atom_list), INTENT(out) :: this\r
+ TYPE(dummy_atom_list), INTENT(in) :: other\r
+\r
+ this%table(1:this%nused) = other%table(1:other%nused)\r
+END SUBROUTINE\r
+! { dg-final { cleanup-modules "class_dummy_atom_types class_dummy_atom_list" } }