Dear all, currently, the compiler doesn't pass the right size to the registration routine of OpenCoarrays for event variables:
size.15 = 0; ev.data = (void * restrict) _gfortran_caf_register (MAX_EXPR <size.15, 1>, 6, &ev.token, 0B, 0B, 0); The attached patch solves the problem. I don't understand the following block in trans-types.c: if (flag_coarray != GFC_FCOARRAY_LIB && derived->from_intmod == INTMOD_ISO_FORTRAN_ENV && derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE) return gfc_get_int_type (gfc_default_integer_kind); Why should an event variable be different from a lock variable when LIBCAF_SINGLE is used? The patch has been built and regtested on x86_64-pc-linux-gnu. Ok for trunk and gcc-5-branch?
gcc/fortran/Changelog 2016-02-20 Alessandro Fanfarillo <fanfarillo....@gmail.com> * trans.c (gfc_allocate_allocatable): size conversion from byte to number of elements for event variables. * trans-types.c (gfc_get_derived_type): event variables represented as a pointer (like lock variable). commit 095c091a8a3ff10fc703e75585b9b57340723648 Author: Alessandro <fanfari...@ing.uniroma2.it> Date: Sat Feb 20 18:11:22 2016 +0100 Right size for events diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index f3d0841..a71cf0b 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -2370,7 +2370,8 @@ gfc_get_derived_type (gfc_symbol * derived) if (derived->attr.unlimited_polymorphic || (flag_coarray == GFC_FCOARRAY_LIB && derived->from_intmod == INTMOD_ISO_FORTRAN_ENV - && derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)) + && (derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE + || derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE))) return ptr_type_node; if (flag_coarray != GFC_FCOARRAY_LIB diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index e71430b..c6688d3 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -820,7 +820,7 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, the FE only passes the pointer around and leaves the actual representation to the library. Hence, we have to convert back to the number of elements. */ - if (lock_var) + if (lock_var || event_var) size = fold_build2_loc (input_location, TRUNC_DIV_EXPR, size_type_node, size, TYPE_SIZE_UNIT (ptr_type_node));