From 4ccff88b71d7988940c736f123071b11fb614d05 Mon Sep 17 00:00:00 2001 From: Andre Vehreschild Date: Fri, 13 Jan 2017 11:22:21 +0100 Subject: [PATCH] re PR fortran/70696 ([Coarray] ICE on EVENT POST of host-associated EVENT_TYPE coarray) gcc/testsuite/ChangeLog: 2017-01-13 Andre Vehreschild PR fortran/70696 * gfortran.dg/coarray/event_3.f08: New test. gcc/fortran/ChangeLog: 2017-01-13 Andre Vehreschild PR fortran/70696 * trans-expr.c (gfc_get_tree_for_caf_expr): Ensure the backend_decl is valid before accessing it. libgfortran/ChangeLog: 2017-01-13 Andre Vehreschild PR fortran/70696 * caf/single.c (_gfortran_caf_register): Allocate enough memory for the event counter. From-SVN: r244407 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-expr.c | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/coarray/event_3.f08 | 20 +++++++++++++++++++ libgfortran/ChangeLog | 6 ++++++ libgfortran/caf/single.c | 7 +++++-- 6 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/coarray/event_3.f08 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 831b96847d1..e979a308239 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2017-01-13 Andre Vehreschild + + PR fortran/70696 + * trans-expr.c (gfc_get_tree_for_caf_expr): Ensure the backend_decl + is valid before accessing it. + 2017-01-09 Jakub Jelinek PR translation/79019 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index caaee6b42da..01b7dd27dce 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1838,6 +1838,10 @@ gfc_get_tree_for_caf_expr (gfc_expr *expr) "component at %L is not supported", &expr->where); } + /* Make sure the backend_decl is present before accessing it. */ + if (expr->symtree->n.sym->backend_decl == NULL_TREE) + expr->symtree->n.sym->backend_decl + = gfc_get_symbol_decl (expr->symtree->n.sym); caf_decl = expr->symtree->n.sym->backend_decl; gcc_assert (caf_decl); if (expr->symtree->n.sym->ts.type == BT_CLASS) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 379eebea759..df14a1bc335 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-13 Andre Vehreschild + + PR fortran/70696 + * gfortran.dg/coarray/event_3.f08: New test. + 2017-01-13 Richard Biener PR tree-optimization/77283 diff --git a/gcc/testsuite/gfortran.dg/coarray/event_3.f08 b/gcc/testsuite/gfortran.dg/coarray/event_3.f08 new file mode 100644 index 00000000000..f6e28b78c8d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray/event_3.f08 @@ -0,0 +1,20 @@ +! { dg-do run } +! +! Check PR fortran/70696 is fixed. + +program global_event + use iso_fortran_env , only : event_type + implicit none + type(event_type) :: x[*] + + call exchange + contains + subroutine exchange + integer :: cnt + event post(x[1]) + event post(x[1]) + call event_query(x, cnt) + if (cnt /= 2) error stop 1 + event wait(x, until_count=2) + end subroutine +end diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index f07dff1b8d6..1a687300a78 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2017-01-13 Andre Vehreschild + + PR fortran/70696 + * caf/single.c (_gfortran_caf_register): Allocate enough memory for + the event counter. + 2017-01-07 Andre Vehreschild PR fortran/78781 diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c index cf78a1a48fd..8d3bcbfb80e 100644 --- a/libgfortran/caf/single.c +++ b/libgfortran/caf/single.c @@ -141,9 +141,12 @@ _gfortran_caf_register (size_t size, caf_register_t type, caf_token_t *token, caf_single_token_t single_token; if (type == CAF_REGTYPE_LOCK_STATIC || type == CAF_REGTYPE_LOCK_ALLOC - || type == CAF_REGTYPE_CRITICAL || type == CAF_REGTYPE_EVENT_STATIC - || type == CAF_REGTYPE_EVENT_ALLOC) + || type == CAF_REGTYPE_CRITICAL) local = calloc (size, sizeof (bool)); + else if (type == CAF_REGTYPE_EVENT_STATIC || type == CAF_REGTYPE_EVENT_ALLOC) + /* In the event_(wait|post) function the counter for events is a uint32, + so better allocate enough memory here. */ + local = calloc (size, sizeof (uint32_t)); else if (type == CAF_REGTYPE_COARRAY_ALLOC_REGISTER_ONLY) local = NULL; else -- 2.30.2