This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch,Fortran] PR43591 - Fix ICE with type-bound procedures and procedure-pointer components in specification expressions
- From: Tobias Burnus <burnus at net-b dot de>
- To: gcc patches <gcc-patches at gcc dot gnu dot org>, gfortran <fortran at gcc dot gnu dot org>
- Date: Sat, 10 Apr 2010 14:25:52 +0200
- Subject: [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" } }