This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR29098 - allocation of a pointer to a derived type crashes
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: patch <gcc-patches at gcc dot gnu dot org>, "'fortran at gcc dot gnu dot org'" <fortran at gcc dot gnu dot org>
- Cc: vahtras at pdc dot kth dot se
- Date: Sun, 17 Sep 2006 13:27:25 +0200
- Subject: [Patch, fortran] PR29098 - allocation of a pointer to a derived type crashes
- References: <450C3CC8.50205@wanadoo.fr>
:ADDPATCH fortran:
In the end, I took a third option to fix this PR:
Ultimately, the failure to resolve the actual argument list was
occurring in resolve.c(resolve_structure_cons). This was returning
FAILURE on finding a NULL expression. I have been unable to think of
any situation where this is warranted, nor I have generated bad code
that gets clobbered by this. Also, in translation, empty expressions
are correctly treated, by the same continuation to the next component.
The testcase is that provided by the reporter.
It should be noted that in trying to break this patch, I generated
PR29115. *sigh*
Regtested on FC5/Athlon - OK for trunk and 4.1?
Paul
2006-09-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29098
* resolve.c (resolve_structure_cons): Do not return FAILURE if
component expression is NULL.
2006-09-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29098
* gfortran.dg/default_initialization_2.f90: New test.
Index: gcc/fortran/resolve.c
===================================================================
*** gcc/fortran/resolve.c (revision 116991)
--- gcc/fortran/resolve.c (working copy)
*************** resolve_structure_cons (gfc_expr * expr)
*** 597,606 ****
for (; comp; comp = comp->next, cons = cons->next)
{
if (! cons->expr)
! {
! t = FAILURE;
! continue;
! }
if (gfc_resolve_expr (cons->expr) == FAILURE)
{
--- 597,603 ----
for (; comp; comp = comp->next, cons = cons->next)
{
if (! cons->expr)
! continue;
if (gfc_resolve_expr (cons->expr) == FAILURE)
{
Index: gcc/testsuite/gfortran.dg/default_initialization_2.f90
===================================================================
*** gcc/testsuite/gfortran.dg/default_initialization_2.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/default_initialization_2.f90 (revision 0)
***************
*** 0 ****
--- 1,36 ----
+ ! { dg-do compile }
+ ! This tests the patch for PR29098, in which the presence of the default
+ ! initializer would cause allocate to fail because the latter uses
+ ! the interface assignment. This, in its turn was failing because
+ ! no expressions were found for the other components; and a FAILURE
+ ! was returned from resolve_structure_cons.
+ !
+ ! Contributed by Olav Vahtras <vahtras@pdc.kth.se>
+ !
+ MODULE MAT
+ TYPE BAS
+ INTEGER :: R = 0,C = 0
+ END TYPE BAS
+ TYPE BLOCK
+ INTEGER, DIMENSION(:), POINTER :: R,C
+ TYPE(BAS), POINTER, DIMENSION(:) :: NO => NULL()
+ END TYPE BLOCK
+ INTERFACE ASSIGNMENT(=)
+ MODULE PROCEDURE BLASSIGN
+ END INTERFACE
+ CONTAINS
+ SUBROUTINE BLASSIGN(A,B)
+ TYPE(BLOCK), INTENT(IN) :: B
+ TYPE(BLOCK), INTENT(INOUT) :: A
+ INTEGER I,N
+ ! ...
+ END SUBROUTINE BLASSIGN
+ END MODULE MAT
+ PROGRAM TEST
+ USE MAT
+ TYPE(BLOCK) MATRIX
+ POINTER MATRIX
+ ALLOCATE(MATRIX)
+ END
+
+ ! { dg-final { cleanup-modules "mat" } }
2006-09-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29098
* resolve.c (resolve_structure_cons): Do not return FAILURE if
component expression is NULL.
2006-09-17 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29098
* gfortran.dg/default_initialization_2.f90: New test.