Message ID | 20170118132639.70979112@vepi2 |
---|---|
State | New |
Headers | show |
On 01/18/2017 04:26 AM, Andre Vehreschild wrote: > Hi all, > > the patch I proposed for this pr unfortunately did not catch all errors. > Dominique figured, that the original testcase was not resolved (thanks for > that). > > This patch resolves the linker problem by putting the static token into the > parent function's decl list. Furthermore does the patch beautify the > retrieval of the symbol in gfc_get_tree_for_caf_expr () and remove the following > assert which is unnecessary then, because the symbol is either already present > or created. And gfc_get_symbol_decl () can not return NULL. > > Bootstrapped and regtested ok on x86_64-linux/f25 and x86-linux/f25 for trunk. > Bootstrapped and regtested ok on x86_64-linux/f25 for gcc-6 (x86-linux has not > been tested, because the VM is not that fast). > > Ok for trunk and gcc-6? > > Regards, > Andre > This one is OK, thanks. Jerry
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index fffb492..51c23e8 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -971,6 +971,8 @@ gfc_build_qualified_array (tree decl, gfc_symbol * sym) DECL_CONTEXT (token) = sym->ns->proc_name->backend_decl; gfc_module_add_decl (cur_module, token); } + else if (sym->attr.host_assoc) + gfc_add_decl_to_parent_function (token); else gfc_add_decl_to_function (token); } diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 01b7dd2..ee8e15d 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1839,11 +1839,10 @@ gfc_get_tree_for_caf_expr (gfc_expr *expr) } /* 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); + caf_decl = expr->symtree->n.sym->backend_decl == NULL_TREE + ? gfc_get_symbol_decl (expr->symtree->n.sym) + : expr->symtree->n.sym->backend_decl; + if (expr->symtree->n.sym->ts.type == BT_CLASS) { if (expr->ref && expr->ref->type == REF_ARRAY) diff --git a/gcc/testsuite/gfortran.dg/coarray_event_1.f08 b/gcc/testsuite/gfortran.dg/coarray_event_1.f08 new file mode 100644 index 0000000..51fc54c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_event_1.f08 @@ -0,0 +1,15 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib -lcaf_single" } + +! Check that pr70696 is really fixed. + + use iso_fortran_env + type(event_type) :: x[*] + + ! exchange must not be called or the link problem before the patch + ! does not occur. +contains + subroutine exchange + event post (x[1]) + end subroutine +end