re PR fortran/34396 (Length of substrings defined by expressions not correctly computed in constructors)

2008-06-17  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/34396
	* resolve.c (add_dt_to_dt_list):  New function.
	(resolve_fl_derived): Call new function for pointer components
	and when derived type resolved.

2008-06-17  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/36366
	* gfortran.dg/used_types_20.f90: New test.

From-SVN: r136871
This commit is contained in:
Paul Thomas 2008-06-17 18:08:24 +00:00
parent e416eb8f02
commit 9d5c21c1f0
4 changed files with 93 additions and 12 deletions

View file

@ -1,3 +1,10 @@
2008-06-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34396
* resolve.c (add_dt_to_dt_list): New function.
(resolve_fl_derived): Call new function for pointer components
and when derived type resolved.
2008-06-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/36515

View file

@ -7586,13 +7586,33 @@ error:
}
/* Add a derived type to the dt_list. The dt_list is used in trans-types.c
to give all identical derived types the same backend_decl. */
static void
add_dt_to_dt_list (gfc_symbol *derived)
{
gfc_dt_list *dt_list;
for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
if (derived == dt_list->derived)
break;
if (dt_list == NULL)
{
dt_list = gfc_get_dt_list ();
dt_list->next = gfc_derived_types;
dt_list->derived = derived;
gfc_derived_types = dt_list;
}
}
/* Resolve the components of a derived type. */
static try
resolve_fl_derived (gfc_symbol *sym)
{
gfc_component *c;
gfc_dt_list * dt_list;
int i;
for (c = sym->components; c != NULL; c = c->next)
@ -7644,6 +7664,16 @@ resolve_fl_derived (gfc_symbol *sym)
return FAILURE;
}
/* Ensure that all the derived type components are put on the
derived type list; even in formal namespaces, where derived type
pointer components might not have been declared. */
if (c->ts.type == BT_DERIVED
&& c->ts.derived
&& c->ts.derived->components
&& c->pointer
&& sym != c->ts.derived)
add_dt_to_dt_list (c->ts.derived);
if (c->pointer || c->allocatable || c->as == NULL)
continue;
@ -7669,17 +7699,7 @@ resolve_fl_derived (gfc_symbol *sym)
return FAILURE;
/* Add derived type to the derived type list. */
for (dt_list = gfc_derived_types; dt_list; dt_list = dt_list->next)
if (sym == dt_list->derived)
break;
if (dt_list == NULL)
{
dt_list = gfc_get_dt_list ();
dt_list->next = gfc_derived_types;
dt_list->derived = sym;
gfc_derived_types = dt_list;
}
add_dt_to_dt_list (sym);
return SUCCESS;
}

View file

@ -1,3 +1,8 @@
2008-06-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/36366
* gfortran.dg/used_types_20.f90: New test.
2008-06-16 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/36546

View file

@ -0,0 +1,49 @@
! { dg-do compile }
! Tests the fix for PR36366 a regression in which the order of USE statements
! in 'test2' would cause the result of 'test1' not to have a reference to
! the derived type 'inner'.
!
! Contributed by Jakub Jelinek <jakub@gcc.gnu.org>
!
MODULE types
IMPLICIT NONE
TYPE :: inner
INTEGER, POINTER :: i(:)
END TYPE inner
TYPE :: outer
TYPE(inner), POINTER :: inr(:)
END TYPE outer
END MODULE types
MODULE mymod
IMPLICIT NONE
CONTAINS
FUNCTION test1()
USE types
IMPLICIT NONE
TYPE(outer), POINTER :: test1
NULLIFY(test1)
END FUNCTION test1
END MODULE mymod
MODULE test
IMPLICIT NONE
CONTAINS
SUBROUTINE test2(a)
USE mymod
USE types
IMPLICIT NONE
TYPE(outer), INTENT(INOUT) :: a
INTEGER :: i
i = a%inr(1)%i(1)
END SUBROUTINE test2
SUBROUTINE test3(a)
USE types
IMPLICIT NONE
TYPE(outer), INTENT(IN) :: a
END SUBROUTINE test3
END MODULE test
! { dg-final { cleanup-modules "types mymod test" } }