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] PR43591 - Fix ICE with type-bound procedures and procedure-pointer components in specification expressions


Hello.

the patch fixes two ICEs with TPB/PPC - and a pureness check. The test
case covers at least gfc_traverse_expr and the pureness check; I am not
sure whether it also covers the gfc_is_constant_expr part as no reduced
test case exists. (It was found in the large 6000+ program after the
first patch and the fix was obvious.)

Build and regtested on x86-64-linux.
OK for the trunk and the 4.5 branch?

Tobias
2010-04-10  Tobias Burnus  <burnus@net-b.de>

	PR fortran/43591
	* expr.c (gfc_is_constant_expr, gfc_traverse_expr): Handle
	proc-pointers and type-bound procedures.
	(gfc_specification_expr): Check proc-pointers for pureness.

2010-04-10  Tobias Burnus  <burnus@net-b.de>

	PR fortran/43591
	* gfortran.dg/spec_expr_6.f90: New test.

Index: gcc/fortran/expr.c
===================================================================
--- gcc/fortran/expr.c	(Revision 158185)
+++ gcc/fortran/expr.c	(Arbeitskopie)
@@ -782,6 +782,8 @@ gfc_is_constant_expr (gfc_expr *e)
       break;
 
     case EXPR_FUNCTION:
+    case EXPR_PPC:
+    case EXPR_COMPCALL:
       /* Specification functions are constant.  */
       if (check_specification_function (e) == MATCH_YES)
 	{
@@ -2808,6 +2810,7 @@ check_restricted (gfc_expr *e)
 gfc_try
 gfc_specification_expr (gfc_expr *e)
 {
+  gfc_component *comp;
 
   if (e == NULL)
     return SUCCESS;
@@ -2822,7 +2825,9 @@ gfc_specification_expr (gfc_expr *e)
   if (e->expr_type == EXPR_FUNCTION
 	  && !e->value.function.isym
 	  && !e->value.function.esym
-	  && !gfc_pure (e->symtree->n.sym))
+	  && !gfc_pure (e->symtree->n.sym)
+	  && (!gfc_is_proc_ptr_comp (e, &comp)
+	      || !comp-> attr.pure))
     {
       gfc_error ("Function '%s' at %L must be PURE",
 		 e->symtree->n.sym->name, &e->where);
@@ -3588,6 +3593,8 @@ gfc_traverse_expr (gfc_expr *expr, gfc_s
 
   switch (expr->expr_type)
     {
+    case EXPR_PPC:
+    case EXPR_COMPCALL:
     case EXPR_FUNCTION:
       for (args = expr->value.function.actual; args; args = args->next)
 	{
Index: gcc/testsuite/gfortran.dg/spec_expr_6.f90
===================================================================
--- gcc/testsuite/gfortran.dg/spec_expr_6.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/spec_expr_6.f90	(Revision 0)
@@ -0,0 +1,52 @@
+! { dg-do compile }
+!
+! PR fortran/43591
+!
+! Pureness check for TPB/PPC in specification expressions
+!
+! Based on a test case of Thorsten Ohl
+!
+!
+
+module m
+  implicit none
+  type t
+     procedure(p1_type), nopass, pointer :: p1 => NULL()
+  contains
+     procedure, nopass :: tbp => p1_type
+  end type t
+contains
+  subroutine proc (t1, t2)
+    type(t), intent(in) :: t1, t2
+    integer, dimension(t1%p1(), t2%tbp()) :: table
+  end subroutine proc
+  pure function p1_type()
+   integer :: p1_type
+   p1_type = 42
+  end function p1_type
+  pure subroutine p(t1)
+    type(t), intent(inout) :: t1
+    integer :: a(t1%p1())
+  end subroutine p
+end module m
+
+module m2
+  implicit none
+  type t
+     procedure(p1_type), nopass, pointer :: p1 => NULL()
+  contains
+     procedure, nopass :: tbp => p1_type
+  end type t
+contains
+  subroutine proc (t1, t2)
+    type(t), intent(in) :: t1, t2
+    integer, dimension(t1%p1()) :: table1 ! { dg-error "must be PURE" }
+    integer, dimension(t2%tbp()) :: table2 ! { dg-error "must be PURE" }
+  end subroutine proc
+  function p1_type()
+    integer :: p1_type
+    p1_type = 42
+  end function p1_type
+end module m2
+
+! { dg-final { cleanup-modules "m m2" } }

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