re PR fortran/42804 (ICE with -fcheck=bounds and type bound procedure call on array...
authorJanus Weil <janus@gcc.gnu.org>
Tue, 19 Jan 2010 22:21:35 +0000 (23:21 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Tue, 19 Jan 2010 22:21:35 +0000 (23:21 +0100)
gcc/fortran/
2010-01-19  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42804
* resolve.c (extract_compcall_passed_object): Set locus for
passed-object argument.
(extract_ppc_passed_object): Set locus and correctly remove PPC
reference.

gcc/testsuite/
2010-01-19  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42804
* gfortran.dg/proc_ptr_comp_pass_6.f90: New test.
* gfortran.dg/typebound_call_12.f03: New test.

From-SVN: r156049

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/proc_ptr_comp_pass_6.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/typebound_call_12.f03 [new file with mode: 0644]

index bbf484cd7553014f2936678994cc7140c1f50cf8..1c29ff473b3813d7daf7a0e48dc4e58c3839850b 100644 (file)
@@ -1,3 +1,11 @@
+2010-01-19  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42804
+       * resolve.c (extract_compcall_passed_object): Set locus for
+       passed-object argument.
+       (extract_ppc_passed_object): Set locus and correctly remove PPC
+       reference.
+
 2010-01-19  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/42783
index 8f32d1a3b6640c73d6f697367b64468f3536a317..fe98b7e0a5453f767d2268fe8d9b8522fcaea79c 100644 (file)
@@ -4777,6 +4777,7 @@ extract_compcall_passed_object (gfc_expr* e)
       po->expr_type = EXPR_VARIABLE;
       po->symtree = e->symtree;
       po->ref = gfc_copy_ref (e->ref);
+      po->where = e->where;
     }
 
   if (gfc_resolve_expr (po) == FAILURE)
@@ -4831,11 +4832,12 @@ extract_ppc_passed_object (gfc_expr *e)
   po->expr_type = EXPR_VARIABLE;
   po->symtree = e->symtree;
   po->ref = gfc_copy_ref (e->ref);
+  po->where = e->where;
 
   /* Remove PPC reference.  */
   ref = &po->ref;
   while ((*ref)->next)
-    (*ref) = (*ref)->next;
+    ref = &(*ref)->next;
   gfc_free_ref_list (*ref);
   *ref = NULL;
 
index bdbed55c45bafa37a4c7103268ed1f53a7f07112..33e9cc84bf7f1afdcd21583a06fa6e6dccbe9758 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-19  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42804
+       * gfortran.dg/proc_ptr_comp_pass_6.f90: New test.
+       * gfortran.dg/typebound_call_12.f03: New test.
+
 2010-01-19  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/42783
diff --git a/gcc/testsuite/gfortran.dg/proc_ptr_comp_pass_6.f90 b/gcc/testsuite/gfortran.dg/proc_ptr_comp_pass_6.f90
new file mode 100644 (file)
index 0000000..8898a59
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+! { dg-options "-fcheck=bounds" }
+!
+! PR 42804: ICE with -fcheck=bounds and type bound procedure call on array element
+!
+! Contributed by Ian Harvey <ian_harvey@bigpond.com>
+
+MODULE ModA
+  IMPLICIT NONE
+  TYPE, PUBLIC :: A
+    PROCEDURE(a_proc),pointer :: Proc
+  END TYPE A
+CONTAINS
+  SUBROUTINE a_proc(this, stat)
+    CLASS(A), INTENT(INOUT) :: this
+    INTEGER, INTENT(OUT) :: stat
+    WRITE (*, *) 'a_proc'
+    stat = 0
+  END SUBROUTINE a_proc
+END MODULE ModA
+
+PROGRAM ProgA
+  USE ModA
+  IMPLICIT NONE
+  INTEGER :: ierr
+  INTEGER :: i
+  TYPE(A), ALLOCATABLE :: arr(:)
+  ALLOCATE(arr(2))
+  DO i = 1, 2
+    arr(i)%proc => a_proc
+    CALL arr(i)%Proc(ierr)
+  END DO
+END PROGRAM ProgA
+
+! { dg-final { cleanup-modules "ModA" } }
diff --git a/gcc/testsuite/gfortran.dg/typebound_call_12.f03 b/gcc/testsuite/gfortran.dg/typebound_call_12.f03
new file mode 100644 (file)
index 0000000..afb0fda
--- /dev/null
@@ -0,0 +1,36 @@
+! { dg-do compile }
+! { dg-options "-fcheck=bounds" }
+!
+! PR 42804: ICE with -fcheck=bounds and type bound procedure call on array element
+!
+! Contributed by Ian Harvey <ian_harvey@bigpond.com>
+
+MODULE ModA
+  IMPLICIT NONE
+  PRIVATE
+  TYPE, PUBLIC :: A
+  CONTAINS
+    PROCEDURE :: Proc => a_proc
+  END TYPE A
+CONTAINS
+  SUBROUTINE a_proc(this, stat)
+    CLASS(A), INTENT(INOUT) :: this
+    INTEGER, INTENT(OUT) :: stat
+    WRITE (*, *) 'a_proc'
+    stat = 0
+  END SUBROUTINE a_proc
+END MODULE ModA
+
+PROGRAM ProgA
+  USE ModA
+  IMPLICIT NONE
+  INTEGER :: ierr
+  INTEGER :: i
+  TYPE(A), ALLOCATABLE :: arr(:)
+  ALLOCATE(arr(2))
+  DO i = 1, 2
+    CALL arr(i)%Proc(ierr)
+  END DO
+END PROGRAM ProgA
+! { dg-final { cleanup-modules "ModA" } }