From 604df1167c464da3710e28270e6561d427df0444 Mon Sep 17 00:00:00 2001 From: Daniel Franke Date: Thu, 10 Dec 2009 14:57:16 -0500 Subject: [PATCH] re PR fortran/34402 (Diagnose illegal initialization of derived type containing allocatable component) gcc/fortran/: 2009-12-10 Daniel Franke PR fortran/34402 * expr.c (check_alloc_comp_init): New. (check_init_expr): Verify that allocatable components are not data-initalized. gcc/testsuite/: 2009-12-10 Daniel Franke PR fortran/34402 * gfortran.dg/alloc_comp_init_expr.f03: New. From-SVN: r155138 --- gcc/fortran/ChangeLog | 7 ++++ gcc/fortran/expr.c | 42 +++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/alloc_comp_init_expr.f03 | 14 +++++++ 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/alloc_comp_init_expr.f03 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2eaf6d00f54..7280dd70e37 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2009-12-10 Daniel Franke + + PR fortran/34402 + * expr.c (check_alloc_comp_init): New. + (check_init_expr): Verify that allocatable components + are not data-initalized. + 2008-12-08 Daniel Kraft PR fortran/41177 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index c693773ebf2..f0cfd189628 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -2034,6 +2034,32 @@ not_numeric: return FAILURE; } +/* F2003, 7.1.7 (3): In init expression, allocatable components + must not be data-initialized. */ +static gfc_try +check_alloc_comp_init (gfc_expr *e) +{ + gfc_component *c; + gfc_constructor *ctor; + + gcc_assert (e->expr_type == EXPR_STRUCTURE); + gcc_assert (e->ts.type == BT_DERIVED); + + for (c = e->ts.u.derived->components, ctor = e->value.constructor; + c; c = c->next, ctor = ctor->next) + { + if (c->attr.allocatable + && ctor->expr->expr_type != EXPR_NULL) + { + gfc_error("Invalid initialization expression for ALLOCATABLE " + "component '%s' in structure constructor at %L", + c->name, &ctor->expr->where); + return FAILURE; + } + } + + return SUCCESS; +} static match check_init_expr_arguments (gfc_expr *e) @@ -2383,10 +2409,18 @@ check_init_expr (gfc_expr *e) break; case EXPR_STRUCTURE: - if (e->ts.is_iso_c) - t = SUCCESS; - else - t = gfc_check_constructor (e, check_init_expr); + t = e->ts.is_iso_c ? SUCCESS : FAILURE; + if (t == SUCCESS) + break; + + t = check_alloc_comp_init (e); + if (t == FAILURE) + break; + + t = gfc_check_constructor (e, check_init_expr); + if (t == FAILURE) + break; + break; case EXPR_ARRAY: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c7ea91a3446..b28f1da2767 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-12-10 Daniel Franke + + PR fortran/34402 + * gfortran.dg/alloc_comp_init_expr.f03: New. + 2009-12-09 David Edelsohn * gcc.target/powerpc/bswap64-4.c: Disable on AIX. diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_init_expr.f03 b/gcc/testsuite/gfortran.dg/alloc_comp_init_expr.f03 new file mode 100644 index 00000000000..5e399ac7114 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/alloc_comp_init_expr.f03 @@ -0,0 +1,14 @@ +! { dg-do "compile" } +! PR fortran/34402 - allocatable components shall not be +! data-initialized in init expr + + type t + real, allocatable :: x(:) + end type + + ! The following is illegal! + type (t) :: bad = t ( (/ 1., 3., 5., 7., 9. /) ) ! { dg-error "Invalid initialization expression" } + + ! This is ok + type (t) :: ok = t ( NULL() ) +end -- 2.30.2