This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Fortran, patch] PR 52158 - Regression on character function with gfortran 4.7
- From: Alessandro Fanfarillo <fanfarillo dot gcc at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org, fortran at gcc dot gnu dot org
- Date: Sun, 6 May 2012 21:37:17 +0200
- Subject: [Fortran, patch] PR 52158 - Regression on character function with gfortran 4.7
Hello,
my name is Alessandro, I'm a newbie of GCC and helped by Tobias Burnus
and Paul Thomas I'll try to add support for final subroutines.
The patch is bootstrapped and tested on x86_64-unknown-linux-gnu - gcc
version 4.8.0 20120506 (experimental)
Best regards.
------------------------------------------------gcc/fortran/ChangeLog------------------------------------------------
2012-05-06 Alessandro Fanfarillo <fanfarillo.gcc@gmail.com>
Paul Thomas <pault@gcc.gnu.org>
Tobias Burnus <burnus@net-b.de>
PR fortran/52158
* resolve.c (resolve_fl_derived0): Add a new condition in the if
statement of the deferred-length character component error block.
* trans-expr (gfc_conv_procedure_call): Add new checks in the if
statement on component's attributes (regarding PR 45170).
------------------------------------------------gcc/testsuite/ChangeLog------------------------------------------------
2012-05-06? Alessandro Fanfarillo? <fanfarillo.gcc@gmail.com>
??????????? Damian Rouson? <damian@rouson.net>
??????? PR fortran/45170
??????? * gfortran.dg/deferred_type_param_3.f90: New.
------------------------------------------------Patch.diff------------------------------------------------
--- gcc-4.8/gcc/fortran/resolve.c 2012-05-06 19:29:21.794825508 +0200
+++ gcc-4.8-patched/gcc/fortran/resolve.c 2012-05-06 19:24:40.770831649 +0200
@@ -11666,7 +11666,7 @@
for ( ; c != NULL; c = c->next)
{
/* See PRs 51550, 47545, 48654, 49050, 51075 - and 45170. */
- if (c->ts.type == BT_CHARACTER && c->ts.deferred)
+ if (c->ts.type == BT_CHARACTER && c->ts.deferred && !c->attr.function)
{
gfc_error ("Deferred-length character component '%s' at %L is not "
"yet supported", c->name, &c->loc);
diff -urN gcc-4.8/gcc/fortran/trans-expr.c
gcc-4.8-patched/gcc/fortran/trans-expr.c
--- gcc-4.8/gcc/fortran/trans-expr.c 2012-05-06 19:29:21.878825505 +0200
+++ gcc-4.8-patched/gcc/fortran/trans-expr.c 2012-05-06 19:25:53.134830069 +0200
@@ -4175,7 +4175,9 @@
we take the character length of the first argument for the result.
For dummies, we have to look through the formal argument list for
this function and use the character length found there.*/
- if (ts.deferred && (sym->attr.allocatable || sym->attr.pointer))
+ if (ts.deferred && ((!comp && (sym->attr.allocatable
+ || sym->attr.pointer)) || (comp && (comp->attr.allocatable
+ || comp->attr.pointer))))
cl.backend_decl = gfc_create_var (gfc_charlen_type_node, "slen");
else if (!sym->attr.dummy)
cl.backend_decl = VEC_index (tree, stringargs, 0);
diff -urN gcc-4.8/gcc/testsuite/gfortran.dg/deferred_type_param_3.f90
gcc-4.8-patched/gcc/testsuite/gfortran.dg/deferred_type_param_3.f90
--- gcc-4.8/gcc/testsuite/gfortran.dg/deferred_type_param_3.f90 1970-01-01
01:00:00.000000000 +0100
+++ gcc-4.8-patched/gcc/testsuite/gfortran.dg/deferred_type_param_3.f90 2012-05-06
19:26:29.498829273 +0200
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! PR fortran/45170
+!
+! Contributed by Damian Rouson
+
+module speaker_class
+ type speaker
+ contains
+ procedure :: speak
+ end type
+contains
+ function speak(this)
+ class(speaker) ,intent(in) :: this
+ character(:) ,allocatable :: speak
+ end function
+ subroutine say_something(somebody)
+ class(speaker) :: somebody
+ print *,somebody%speak()
+ end subroutine
+end module