From 29eb509ccb9acd5aac604e6796e376bc09c4626d Mon Sep 17 00:00:00 2001 From: Andre Vehreschild Date: Fri, 15 Jul 2016 11:28:47 +0200 Subject: [PATCH] re PR fortran/71807 (Internal compiler error with NULL() reference in structure constructor) gcc/fortran/ChangeLog: 2016-07-15 Andre Vehreschild PR fortran/71807 * trans-expr.c (gfc_trans_subcomponent_assign): Special casing when allocatable component is set to null() in initializer. gcc/testsuite/ChangeLog: 2016-07-15 Andre Vehreschild PR fortran/71807 * gfortran.dg/null_9.f90: New test. From-SVN: r238368 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-expr.c | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/null_9.f90 | 30 ++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/null_9.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 594b19ec9a3..22ca4f4e488 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-07-15 Andre Vehreschild + + PR fortran/71807 + * trans-expr.c (gfc_trans_subcomponent_assign): Special casing + when allocatable component is set to null() in initializer. + 2016-07-14 Steven G. Kargl PR fortran/29819 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 4321850b59d..e3559f4e00e 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -7200,6 +7200,12 @@ gfc_trans_subcomponent_assign (tree dest, gfc_component * cm, gfc_expr * expr, tmp = gfc_trans_alloc_subarray_assign (tmp, cm, expr); gfc_add_expr_to_block (&block, tmp); } + else if (init && cm->attr.allocatable && expr->expr_type == EXPR_NULL) + { + /* NULL initialization for allocatable components. */ + gfc_add_modify (&block, dest, fold_convert (TREE_TYPE (dest), + null_pointer_node)); + } else if (init && (cm->attr.allocatable || (cm->ts.type == BT_CLASS && CLASS_DATA (cm)->attr.allocatable && expr->ts.type != BT_CLASS))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f31c63eac79..5ad50f944d8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-15 Andre Vehreschild + + PR fortran/71807 + * gfortran.dg/null_9.f90: New test. + 2016-07-15 Bin Cheng * gcc.dg/tree-ssa/loop-41.c: New test. diff --git a/gcc/testsuite/gfortran.dg/null_9.f90 b/gcc/testsuite/gfortran.dg/null_9.f90 new file mode 100644 index 00000000000..9afd93801cc --- /dev/null +++ b/gcc/testsuite/gfortran.dg/null_9.f90 @@ -0,0 +1,30 @@ +! { dg-do run } + +MODULE fold_convert_loc_ice + IMPLICIT NONE + PRIVATE + + TYPE, PUBLIC :: ta + PRIVATE + INTEGER :: a_comp + END TYPE ta + + TYPE, PUBLIC :: tb + TYPE(ta), ALLOCATABLE :: b_comp + END TYPE tb + + PUBLIC :: proc +CONTAINS + SUBROUTINE proc + TYPE(tb) :: b + + b = tb(null()) + if (allocated( b%b_comp )) call abort() + END SUBROUTINE proc +END MODULE fold_convert_loc_ice + + USE fold_convert_loc_ice + + call proc() +END + -- 2.30.2