OSDN Git Service

2006-09-10 Paul Thomas <pault@gcc.gnu.org>
authorpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 17:17:57 +0000 (17:17 +0000)
committerpault <pault@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 10 Sep 2006 17:17:57 +0000 (17:17 +0000)
PR fortran/28959
trans-types.c (gfc_get_derived_type): Use the parent namespace of
the procedure if the type's own namespace does not have a parent.

2006-09-10  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/28959
gfortran.dg/used_types_10: New test.

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

gcc/fortran/ChangeLog
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/used_types_10.f90 [new file with mode: 0644]

index 5b62215..159b4d1 100644 (file)
@@ -1,5 +1,11 @@
 2006-09-10  Paul Thomas  <pault@gcc.gnu.org>
 
+       PR fortran/28959
+       trans-types.c (gfc_get_derived_type): Use the parent namespace of
+       the procedure if the type's own namespace does not have a parent.
+
+2006-09-10  Paul Thomas  <pault@gcc.gnu.org>
+
        PR fortran/28923
        expr.c (find_array_section): Only use the array lower and upper
        bounds for the start and end of the sections, where the expr is
index 4ecf94b..377a5af 100644 (file)
@@ -1483,7 +1483,12 @@ gfc_get_derived_type (gfc_symbol * derived)
         same TREE_TYPE.  If an equal type is found without a backend_decl,
         build the parent version and use it in the current namespace.  */
 
-      for (ns = derived->ns->parent; ns; ns = ns->parent)
+      /* Derived types in an interface body obtain their parent reference
+        through the proc_name symbol.  */
+      ns = derived->ns->parent ? derived->ns->parent
+                              : derived->ns->proc_name->ns->parent;
+
+      for (; ns; ns = ns->parent)
        {
          for (dt = ns->derived_types; dt; dt = dt->next)
            {
index 152d5cf..c482122 100644 (file)
@@ -1,4 +1,9 @@
-2006-09-09  Paul Thomas  <pault@gcc.gnu.org>
+2006-09-10  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/28959
+       gfortran.dg/used_types_10: New test.
+
+2006-09-10  Paul Thomas  <pault@gcc.gnu.org>
 
        PR libfortran/28923
        gfortran.dg/array_initializer_2.f90: Fill in missing index start value.
diff --git a/gcc/testsuite/gfortran.dg/used_types_10.f90 b/gcc/testsuite/gfortran.dg/used_types_10.f90
new file mode 100644 (file)
index 0000000..c35fb58
--- /dev/null
@@ -0,0 +1,72 @@
+! { dg-do compile }
+! Tests the fix for PR28959 in which interface derived types were
+! not always being associated.
+!
+! Contributed by Salvatore Filippone  <sfilippone@uniroma2.it>
+!
+module derived_type_mod
+
+  type foo_dtype
+    integer, pointer :: v1(:)=>null()
+  end type foo_dtype
+  
+
+end module derived_type_mod
+
+
+Module tools
+
+  interface foo_d_sub
+     subroutine cdalv(m, v, i, desc_a, info, flag)
+       use derived_type_mod
+       Integer, intent(in)               :: m,i, v(:)
+       integer, intent(in), optional     :: flag
+       integer, intent(out)              :: info
+       Type(foo_dtype), intent(out)  :: desc_a
+     end subroutine cdalv
+  end interface
+
+end module tools
+
+
+
+subroutine foo_bar(a,p,info)
+  use derived_type_mod
+  implicit none
+
+  type(foo_dtype), intent(in)            :: a
+  type(foo_dtype), intent(inout)         :: p
+  integer, intent(out)                   :: info
+
+  info=0
+
+  call inner_sub(info)
+    
+
+  return
+
+
+contains
+
+  subroutine inner_sub(info)
+    use tools
+    implicit none 
+
+    integer, intent(out)   :: info
+
+    integer :: i, nt,iv(10)
+    
+    i  = 0
+    nt = 1
+    
+    call foo_d_sub(nt,iv,i,p,info,flag=1)
+    
+    return
+
+
+  end subroutine inner_sub
+
+
+
+end subroutine foo_bar
+! { dg-final { cleanup-modules "derived_type_mod tools" } }