aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/expr.c
diff options
context:
space:
mode:
authorDaniel Franke <franke.daniel@gmail.com>2010-05-19 09:07:25 -0400
committerDaniel Franke <dfranke@gcc.gnu.org>2010-05-19 09:07:25 -0400
commit16e520b612ab84443b252e2358f32d82014235fd (patch)
treee0687cd664f9a6348ad5eb6263da235d6f5fabe4 /gcc/fortran/expr.c
parent66faed764371fe6385d54d6e7dc0a9cb0fa5c67f (diff)
downloadgcc-16e520b612ab84443b252e2358f32d82014235fd.zip
gcc-16e520b612ab84443b252e2358f32d82014235fd.tar.gz
gcc-16e520b612ab84443b252e2358f32d82014235fd.tar.bz2
re PR fortran/42360 (intent(out)-dummy-not-set warning for types depends on order of component initializers)
gcc/fortran/: 2010-05-19 Daniel Franke <franke.daniel@gmail.com> PR fortran/42360 * gfortran.h (gfc_has_default_initializer): New. * expr.c (gfc_has_default_initializer): New. * resolve.c (has_default_initializer): Removed, use gfc_has_default_initializer() instead. Updated all callers. * trans-array.c (has_default_initializer): Removed, use gfc_has_default_initializer() instead. Updated all callers. * trans-decl.c (generate_local_decl): Do not check the first component only to check for initializers, but use gfc_has_default_initializer() instead. gcc/testsuite/: 2010-05-19 Daniel Franke <franke.daniel@gmail.com> PR fortran/42360 * gfortran.dg/warn_intent_out_not_set.f90: New. From-SVN: r159562
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r--gcc/fortran/expr.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c
index 75f27be..6884c90 100644
--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3557,6 +3557,31 @@ gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
}
+/* Check for default initializer; sym->value is not enough
+ as it is also set for EXPR_NULL of allocatables. */
+
+bool
+gfc_has_default_initializer (gfc_symbol *der)
+{
+ gfc_component *c;
+
+ gcc_assert (der->attr.flavor == FL_DERIVED);
+ for (c = der->components; c; c = c->next)
+ if (c->ts.type == BT_DERIVED)
+ {
+ if (!c->attr.pointer
+ && gfc_has_default_initializer (c->ts.u.derived))
+ return true;
+ }
+ else
+ {
+ if (c->initializer)
+ return true;
+ }
+
+ return false;
+}
+
/* Get an expression for a default initializer. */
gfc_expr *
@@ -3565,7 +3590,8 @@ gfc_default_initializer (gfc_typespec *ts)
gfc_expr *init;
gfc_component *comp;
- /* See if we have a default initializer. */
+ /* See if we have a default initializer in this, but not in nested
+ types (otherwise we could use gfc_has_default_initializer()). */
for (comp = ts->u.derived->components; comp; comp = comp->next)
if (comp->initializer || comp->attr.allocatable)
break;