re PR fortran/50408 (ICE in transfer_expr)

2011-11-25  Tobias Burnus  <burnus@net-b.de>

        PR fortran/50408
        * trans-decl.c (gfc_get_module_backend_decl): Also copy
        ts.u.derived from the gsym if the ts.type is BT_CLASS.
        (gfc_get_extern_function_decl): Copy also the backend_decl
        for the symbol's ts.u.{derived,cl} from the gsym.
        * trans-types.c (gfc_copy_dt_decls_ifequal): Directly
        return if "from" and "to" are the same.

2011-11-25  Tobias Burnus  <burnus@net-b.de>

        PR fortran/50408
        * gfortran.dg/whole_file_35.f90: New.

From-SVN: r181725
This commit is contained in:
Tobias Burnus 2011-11-25 17:26:47 +01:00 committed by Tobias Burnus
parent 8594f636ac
commit f29bda8308
5 changed files with 52 additions and 1 deletions

View File

@ -1,3 +1,13 @@
2011-11-25 Tobias Burnus <burnus@net-b.de>
PR fortran/50408
* trans-decl.c (gfc_get_module_backend_decl): Also copy
ts.u.derived from the gsym if the ts.type is BT_CLASS.
(gfc_get_extern_function_decl): Copy also the backend_decl
for the symbol's ts.u.{derived,cl} from the gsym.
* trans-types.c (gfc_copy_dt_decls_ifequal): Directly
return if "from" and "to" are the same.
2011-11-25 Tobias Burnus <burnus@net-b.de>
PR fortran/51302

View File

@ -718,7 +718,7 @@ gfc_get_module_backend_decl (gfc_symbol *sym)
}
else if (s->backend_decl)
{
if (sym->ts.type == BT_DERIVED)
if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
true);
else if (sym->ts.type == BT_CHARACTER)
@ -1670,6 +1670,11 @@ gfc_get_extern_function_decl (gfc_symbol * sym)
gfc_find_symbol (sym->name, gsym->ns, 0, &s);
if (s && s->backend_decl)
{
if (sym->ts.type == BT_DERIVED || sym->ts.type == BT_CLASS)
gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
true);
else if (sym->ts.type == BT_CHARACTER)
sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
sym->backend_decl = s->backend_decl;
return sym->backend_decl;
}

View File

@ -2188,6 +2188,9 @@ gfc_copy_dt_decls_ifequal (gfc_symbol *from, gfc_symbol *to,
gfc_component *to_cm;
gfc_component *from_cm;
if (from == to)
return 1;
if (from->backend_decl == NULL
|| !gfc_compare_derived_types (from, to))
return 0;

View File

@ -1,3 +1,8 @@
2011-11-25 Tobias Burnus <burnus@net-b.de>
PR fortran/50408
* gfortran.dg/whole_file_35.f90: New.
2011-11-25 Tobias Burnus <burnus@net-b.de>
PR fortran/51302

View File

@ -0,0 +1,28 @@
! { dg-do compile }
!
! PR fortran/50408
!
! Contributed by Vittorio Zecca
!
module m
type int
integer :: val
end type int
interface ichar
module procedure uch
end interface
contains
function uch (c)
character (len=1), intent (in) :: c
type (int) :: uch
intrinsic ichar
uch%val = 127 - ichar (c)
end function uch
end module m
program p
use m
print *,ichar('~') ! must print "1"
end program p
! { dg-final { cleanup-modules "m" } }