This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, fortran] PR29098 - allocation of a pointer to a derived type crashes


: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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]