diff options
Diffstat (limited to 'gcc/fortran/trans.c')
-rw-r--r-- | gcc/fortran/trans.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index 2a91c35..001db41 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -711,7 +711,7 @@ gfc_allocate_using_malloc (stmtblock_t * block, tree pointer, static void gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size, tree token, tree status, tree errmsg, tree errlen, - bool lock_var) + bool lock_var, bool event_var) { tree tmp, pstat; @@ -738,7 +738,8 @@ gfc_allocate_using_lib (stmtblock_t * block, tree pointer, tree size, build_int_cst (size_type_node, 1)), build_int_cst (integer_type_node, lock_var ? GFC_CAF_LOCK_ALLOC - : GFC_CAF_COARRAY_ALLOC), + : event_var ? GFC_CAF_EVENT_ALLOC + : GFC_CAF_COARRAY_ALLOC), token, pstat, errmsg, errlen); tmp = fold_build2_loc (input_location, MODIFY_EXPR, @@ -798,6 +799,11 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, == INTMOD_ISO_FORTRAN_ENV && expr->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE; + bool event_var = expr->ts.type == BT_DERIVED + && expr->ts.u.derived->from_intmod + == INTMOD_ISO_FORTRAN_ENV + && expr->ts.u.derived->intmod_sym_id + == ISOFORTRAN_EVENT_TYPE; /* In the front end, we represent the lock variable as pointer. However, the FE only passes the pointer around and leaves the actual representation to the library. Hence, we have to convert back to the @@ -807,7 +813,7 @@ gfc_allocate_allocatable (stmtblock_t * block, tree mem, tree size, tree token, size, TYPE_SIZE_UNIT (ptr_type_node)); gfc_allocate_using_lib (&alloc_block, mem, size, token, status, - errmsg, errlen, lock_var); + errmsg, errlen, lock_var, event_var); if (status != NULL_TREE) { @@ -1797,6 +1803,11 @@ trans_code (gfc_code * code, tree cond) res = gfc_trans_lock_unlock (code, code->op); break; + case EXEC_EVENT_POST: + case EXEC_EVENT_WAIT: + res = gfc_trans_event_post_wait (code, code->op); + break; + case EXEC_FORALL: res = gfc_trans_forall (code); break; |