aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2017-01-13 11:22:21 +0100
committerAndre Vehreschild <vehre@gcc.gnu.org>2017-01-13 11:22:21 +0100
commit4ccff88b71d7988940c736f123071b11fb614d05 (patch)
tree02a651be289a53ea81ff6fe0d011d7b35f3e8ef2
parentd8f43ee6d0921b73670e8e123cdd0850dfeb330e (diff)
downloadgcc-4ccff88b71d7988940c736f123071b11fb614d05.zip
gcc-4ccff88b71d7988940c736f123071b11fb614d05.tar.gz
gcc-4ccff88b71d7988940c736f123071b11fb614d05.tar.bz2
re PR fortran/70696 ([Coarray] ICE on EVENT POST of host-associated EVENT_TYPE coarray)
gcc/testsuite/ChangeLog: 2017-01-13 Andre Vehreschild <vehre@gcc.gnu.org> PR fortran/70696 * gfortran.dg/coarray/event_3.f08: New test. gcc/fortran/ChangeLog: 2017-01-13 Andre Vehreschild <vehre@gcc.gnu.org> 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 <vehre@gcc.gnu.org> PR fortran/70696 * caf/single.c (_gfortran_caf_register): Allocate enough memory for the event counter. From-SVN: r244407
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-expr.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/coarray/event_3.f0820
-rw-r--r--libgfortran/ChangeLog6
-rw-r--r--libgfortran/caf/single.c7
6 files changed, 46 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 831b968..e979a30 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2017-01-13 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ 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 <jakub@redhat.com>
PR translation/79019
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index caaee6b..01b7dd2 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 379eebe..df14a1b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-13 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/70696
+ * gfortran.dg/coarray/event_3.f08: New test.
+
2017-01-13 Richard Biener <rguenther@suse.de>
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 0000000..f6e28b7
--- /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 f07dff1..1a68730 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2017-01-13 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/70696
+ * caf/single.c (_gfortran_caf_register): Allocate enough memory for
+ the event counter.
+
2017-01-07 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78781
diff --git a/libgfortran/caf/single.c b/libgfortran/caf/single.c
index cf78a1a..8d3bcbf 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