diff options
author | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-25 16:26:47 +0000 |
---|---|---|
committer | burnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-11-25 16:26:47 +0000 |
commit | 85ec2f13d0e6b1090dc8a28237bfbc9d964df94d (patch) | |
tree | c3e8d5893fa32c51d1e46b85f536c078a51acab9 | |
parent | bf9f252769d12da181ccbd8e1cd5bf9bff31f0fa (diff) | |
download | ppe42-gcc-85ec2f13d0e6b1090dc8a28237bfbc9d964df94d.tar.gz ppe42-gcc-85ec2f13d0e6b1090dc8a28237bfbc9d964df94d.zip |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181725 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/whole_file_35.f90 | 28 |
5 files changed, 52 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 22d0fa4b8f4..f0faca4b7f0 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,15 @@ 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 * trans-stmt.c (gfc_trans_simple_do): Add a fold_convert. diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index fc8a9ed4e4b..67bd3e233f0 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -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; } diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 3f4ebd5b7b7..d643c2e45b8 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ea8225d3db..34d262f3427 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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 * gfortran.dg/volatile13.f90: New. diff --git a/gcc/testsuite/gfortran.dg/whole_file_35.f90 b/gcc/testsuite/gfortran.dg/whole_file_35.f90 new file mode 100644 index 00000000000..46a88655145 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/whole_file_35.f90 @@ -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" } } |