re PR fortran/48059 ([OOP] ICE in in gfc_conv_component_ref: character function of...
authorJanus Weil <janus@gcc.gnu.org>
Sat, 12 Mar 2011 16:58:33 +0000 (17:58 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 12 Mar 2011 16:58:33 +0000 (17:58 +0100)
2011-03-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/48059
* trans-expr.c (gfc_apply_interface_mapping_to_expr): Replace base type
for polymorphic arguments.

2011-03-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/48059
* gfortran.dg/class_41.f03: New.

From-SVN: r170906

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/class_41.f03 [new file with mode: 0644]

index ac95f2ae84e5b23b0201d3c70d58ff2442b497d5..503b7b8c3d40ff4586187a7655becd962c3c66b9 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/48059
+       * trans-expr.c (gfc_apply_interface_mapping_to_expr): Replace base type
+       for polymorphic arguments.
+
 2011-03-12  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/48054
index d6c1f9f5a170bf96f2c294d32d12af72de040dfa..da7cfba5981745caa0c13848f84cf198609ffe3d 100644 (file)
@@ -2247,6 +2247,10 @@ gfc_apply_interface_mapping_to_expr (gfc_interface_mapping * mapping,
          expr->symtree = sym->new_sym;
        else if (sym->expr)
          gfc_replace_expr (expr, gfc_copy_expr (sym->expr));
+       /* Replace base type for polymorphic arguments.  */
+       if (expr->ref && expr->ref->type == REF_COMPONENT
+           && sym->expr && sym->expr->ts.type == BT_CLASS)
+         expr->ref->u.c.sym = sym->expr->ts.u.derived;
       }
 
       /* ...and to subexpressions in expr->value.  */
index 412188a01a736e38b89fffe16a5dd307395d3041..f2b2712bb210047cc8c6065f3330b9bccbab48d5 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/48059
+       * gfortran.dg/class_41.f03: New.
+
 2011-03-11  Dodji Seketeli  <dodji@redhat.com>
 
        * g++.dg/conversion/cast3.C: New test.
diff --git a/gcc/testsuite/gfortran.dg/class_41.f03 b/gcc/testsuite/gfortran.dg/class_41.f03
new file mode 100644 (file)
index 0000000..bcab2b4
--- /dev/null
@@ -0,0 +1,24 @@
+! { dg-do compile }
+!
+! PR 48059: [4.6 Regression][OOP] ICE in in gfc_conv_component_ref: character function of extended type
+!
+! Contributed by Hans-Werner Boschmann <boschmann@tp1.physik.uni-siegen.de>
+
+module a_module
+  type :: a_type
+     integer::length=0
+  end type a_type
+  type,extends(a_type) :: b_type
+  end type b_type
+contains
+  function a_string(this) result(form)
+    class(a_type),intent(in)::this
+    character(max(1,this%length))::form
+  end function a_string
+  subroutine b_sub(this)
+    class(b_type),intent(inout),target::this
+    print *,a_string(this)
+  end subroutine b_sub
+end module a_module
+
+! { dg-final { cleanup-modules "a_module" } }