aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2010-07-23 22:13:07 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2010-07-23 22:13:07 +0200
commit43afc04731d5549c01edbef81a65959565168ba5 (patch)
tree3f39d7ddcebd9dfbe34d03ae5000327341777035 /gcc
parent48a32c49568d0f93edb0a904f5ac871e4e44c091 (diff)
downloadgcc-43afc04731d5549c01edbef81a65959565168ba5.zip
gcc-43afc04731d5549c01edbef81a65959565168ba5.tar.gz
gcc-43afc04731d5549c01edbef81a65959565168ba5.tar.bz2
re PR fortran/44945 (Wrong decl for module vars / FAIL: gfortran.dg/char_array_structure_constructor.f90)
2010-07-23 Tobias Burnus <burnus@net-b.de> PR fortran/44945 * trans-decl.c (gfc_get_symbol_decl): Use module decl with -fwhole-file also for derived types. * trans-types.c (copy_dt_decls_ifequal): Remove static and rename to gfc_copy_dt_decls_ifequal. (gfc_get_derived_type): Update call. * trans-types.h (gfc_copy_dt_decls_ifequal): Add prototype. 2010-07-23 Tobias Burnus <burnus@net-b.de> PR fortran/44945 * gfortran.dg/char_array_structure_constructor.f90: Add -fwhole-file as dg-option as it otherwise fails on some systems. From-SVN: r162487
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/trans-decl.c7
-rw-r--r--gcc/fortran/trans-types.c10
-rw-r--r--gcc/fortran/trans-types.h1
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/char_array_structure_constructor.f905
6 files changed, 32 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0fac55c..e485e72 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,5 +1,15 @@
2010-07-23 Tobias Burnus <burnus@net-b.de>
+ PR fortran/44945
+ * trans-decl.c (gfc_get_symbol_decl): Use module decl with
+ -fwhole-file also for derived types.
+ * trans-types.c (copy_dt_decls_ifequal): Remove static and
+ rename to gfc_copy_dt_decls_ifequal.
+ (gfc_get_derived_type): Update call.
+ * trans-types.h (gfc_copy_dt_decls_ifequal): Add prototype.
+
+2010-07-23 Tobias Burnus <burnus@net-b.de>
+
PR fortran/45030
* resolve.c (resolve_global_procedure): Properly handle ENTRY.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 2b03011..a1789ea 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -1129,11 +1129,9 @@ gfc_get_symbol_decl (gfc_symbol * sym)
return sym->backend_decl;
/* If use associated and whole file compilation, use the module
- declaration. This is only needed for intrinsic types because
- they are substituted for one another during optimization. */
+ declaration. */
if (gfc_option.flag_whole_file
&& sym->attr.flavor == FL_VARIABLE
- && sym->ts.type != BT_DERIVED
&& sym->attr.use_assoc
&& sym->module)
{
@@ -1147,6 +1145,9 @@ gfc_get_symbol_decl (gfc_symbol * sym)
gfc_find_symbol (sym->name, gsym->ns, 0, &s);
if (s && s->backend_decl)
{
+ if (sym->ts.type == BT_DERIVED)
+ gfc_copy_dt_decls_ifequal (s->ts.u.derived, sym->ts.u.derived,
+ true);
if (sym->ts.type == BT_CHARACTER)
sym->ts.u.cl->backend_decl = s->ts.u.cl->backend_decl;
return s->backend_decl;
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 34efa9a..62b298c 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -1884,8 +1884,8 @@ gfc_add_field_to_struct (tree context, tree name, tree type, tree **chain)
the two derived type symbols are "equal", as described
in 4.4.2 and resolved by gfc_compare_derived_types. */
-static int
-copy_dt_decls_ifequal (gfc_symbol *from, gfc_symbol *to,
+int
+gfc_copy_dt_decls_ifequal (gfc_symbol *from, gfc_symbol *to,
bool from_gsym)
{
gfc_component *to_cm;
@@ -1996,7 +1996,7 @@ gfc_get_derived_type (gfc_symbol * derived)
gfc_find_symbol (derived->name, gsym->ns, 0, &s);
if (s && s->backend_decl)
{
- copy_dt_decls_ifequal (s, derived, true);
+ gfc_copy_dt_decls_ifequal (s, derived, true);
goto copy_derived_types;
}
}
@@ -2016,7 +2016,7 @@ gfc_get_derived_type (gfc_symbol * derived)
dt = ns->derived_types;
for (; dt && !canonical; dt = dt->next)
{
- copy_dt_decls_ifequal (dt->derived, derived, true);
+ gfc_copy_dt_decls_ifequal (dt->derived, derived, true);
if (derived->backend_decl)
got_canonical = true;
}
@@ -2183,7 +2183,7 @@ gfc_get_derived_type (gfc_symbol * derived)
copy_derived_types:
for (dt = gfc_derived_types; dt; dt = dt->next)
- copy_dt_decls_ifequal (derived, dt->derived, false);
+ gfc_copy_dt_decls_ifequal (derived, dt->derived, false);
return derived->backend_decl;
}
diff --git a/gcc/fortran/trans-types.h b/gcc/fortran/trans-types.h
index 7e79480..63427f3 100644
--- a/gcc/fortran/trans-types.h
+++ b/gcc/fortran/trans-types.h
@@ -64,6 +64,7 @@ tree gfc_get_character_type_len_for_eltype (tree, tree);
tree gfc_sym_type (gfc_symbol *);
tree gfc_typenode_for_spec (gfc_typespec *);
+int gfc_copy_dt_decls_ifequal (gfc_symbol *, gfc_symbol *, bool);
tree gfc_get_function_type (gfc_symbol *);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bdc2660..4083476 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2010-07-23 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/44945
+ * gfortran.dg/char_array_structure_constructor.f90: Add
+ -fwhole-file as dg-option as it otherwise fails on some
+ systems.
+
2010-07-23 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/aggr16.ad[sb]: New test.
diff --git a/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90 b/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
index 9d05874..2266936 100644
--- a/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
+++ b/gcc/testsuite/gfortran.dg/char_array_structure_constructor.f90
@@ -1,4 +1,9 @@
! { dg-do run }
+! { dg-options "-fwhole-file" }
+!
+! PR fortran/19107
+! -fwhole-file flag added for PR fortran/44945
+!
! This test the fix of PR19107, where character array actual
! arguments in derived type constructors caused an ICE.
! It also checks that the scalar counterparts are OK.