summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-25 16:26:47 +0000
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>2011-11-25 16:26:47 +0000
commit85ec2f13d0e6b1090dc8a28237bfbc9d964df94d (patch)
treec3e8d5893fa32c51d1e46b85f536c078a51acab9
parentbf9f252769d12da181ccbd8e1cd5bf9bff31f0fa (diff)
downloadppe42-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/ChangeLog10
-rw-r--r--gcc/fortran/trans-decl.c7
-rw-r--r--gcc/fortran/trans-types.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/whole_file_35.f9028
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" } }
OpenPOWER on IntegriCloud