OSDN Git Service

gcc/fortran/
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jan 2010 22:21:35 +0000 (22:21 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Jan 2010 22:21:35 +0000 (22:21 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@156049 138bc75d-0d04-0410-961f-82ee72b054a4

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 bbf484c..1c29ff4 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 8f32d1a..fe98b7e 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 bdbed55..33e9cc8 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" } }