1 Upstream-Status: Inappropriate [Backport]
2 From 348c7b9400ed5fe0d8c3c077f8223ca359bed036 Mon Sep 17 00:00:00 2001
3 From: pault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
4 Date: Wed, 13 Apr 2011 18:38:17 +0000
5 Subject: [PATCH 116/200] 2011-04-13 Paul Thomas <pault@gcc.gnu.org>
9 * trans-array.c (get_std_lbound): For derived type variables
10 return array valued component lbound.
12 2011-04-13 Paul Thomas <pault@gcc.gnu.org>
16 * gfortran.dg/realloc_on_assign_6.f03: New test.
18 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172390 138bc75d-0d04-0410-961f-82ee72b054a4
20 index ac08c42..3d4a52a 100644
21 --- a/gcc/fortran/trans-array.c
22 +++ b/gcc/fortran/trans-array.c
23 @@ -6707,6 +6707,8 @@ get_std_lbound (gfc_expr *expr, tree desc, int dim, bool assumed_size)
25 tree cond, cond1, cond3, cond4;
29 if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (desc)))
31 tmp = gfc_rank_cst[dim];
32 @@ -6740,6 +6742,14 @@ get_std_lbound (gfc_expr *expr, tree desc, int dim, bool assumed_size)
33 else if (expr->expr_type == EXPR_VARIABLE)
35 tmp = TREE_TYPE (expr->symtree->n.sym->backend_decl);
36 + for (ref = expr->ref; ref; ref = ref->next)
38 + if (ref->type == REF_COMPONENT
39 + && ref->u.c.component->as
41 + && ref->next->u.ar.type == AR_FULL)
42 + tmp = TREE_TYPE (ref->u.c.component->backend_decl);
44 return GFC_TYPE_ARRAY_LBOUND(tmp, dim);
46 else if (expr->expr_type == EXPR_FUNCTION)
48 index 0000000..7c170eb
50 +++ b/gcc/testsuite/gfortran.dg/realloc_on_assign_6.f03
53 +! Test the fix for PR48456 and PR48360 in which the backend
54 +! declarations for components were not located in the automatic
55 +! reallocation on assignments, thereby causing ICEs.
57 +! Contributed by Keith Refson <krefson@googlemail.com>
58 +! and Douglas Foulds <mixnmaster@gmail.com>
64 + real, dimension(3,3) :: h0
70 + real, allocatable, save, dimension(:,:) :: hmat
81 + end subroutine assignit
88 +integer, parameter :: dp = kind(0.d0)
91 + real(dp), dimension(5) :: some_vector
95 + type(my_type_sub) :: some_element
98 +end module custom_type
100 +module custom_interfaces
103 + subroutine store_data_subroutine(vec_size)
105 + integer, intent(in) :: vec_size
107 + end subroutine store_data_subroutine
110 +end module custom_interfaces
112 +module store_data_test
117 +type(my_type), dimension(:), allocatable :: some_type_to_save
119 +end module store_data_test
129 +call store_data_subroutine(vec_size)
130 +call print_after_transfer()
134 +subroutine store_data_subroutine(vec_size)
141 +integer, intent(in) :: vec_size
144 +allocate(some_type_to_save(vec_size))
148 + some_type_to_save(k)%some_element%some_vector(1) = 1.0_dp
149 + some_type_to_save(k)%some_element%some_vector(2) = 2.0_dp
150 + some_type_to_save(k)%some_element%some_vector(3) = 3.0_dp
151 + some_type_to_save(k)%some_element%some_vector(4) = 4.0_dp
152 + some_type_to_save(k)%some_element%some_vector(5) = 5.0_dp
156 +end subroutine store_data_subroutine
158 +subroutine print_after_transfer()
165 +real(dp), dimension(:), allocatable :: C_vec
170 +do k = 1,size(some_type_to_save)
172 + C_vec = some_type_to_save(k)%some_element%some_vector
173 + print *, "C_vec", C_vec
177 +end subroutine print_after_transfer
178 +! { dg-final { cleanup-modules "m gf33" } }
179 +! { dg-final { cleanup-modules "custom_type custom_interfaces" } }
180 +! { dg-final { cleanup-modules "store_data_test" } }