]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/28959 (ICE on derived type with host association)
authorPaul Thomas <pault@gcc.gnu.org>
Sun, 10 Sep 2006 17:17:57 +0000 (17:17 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sun, 10 Sep 2006 17:17:57 +0000 (17:17 +0000)
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/28959
gfortran.dg/used_types_10: New test.

From-SVN: r116816

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 5b6221573984a2030a00cdbd737761f27f445310..159b4d13a49f960af9b321ed8ff6ef44995e9d3e 100644 (file)
@@ -1,3 +1,9 @@
+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
index 4ecf94b4c9fc6941292965ab0004f8fa3602ab9f..377a5af9fa0ec3c1a8f17be270627a83bd152530 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 152d5cf911e7d9457b608cb26290afa6d6c5bef9..c482122901d617fa7b737b7c86cf5997a51ed36d 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" } }