diff options
author | Tobias Burnus <burnus@gcc.gnu.org> | 2011-05-26 19:41:34 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2011-05-26 19:41:34 +0200 |
commit | b8ff4e88e790df436088012ce6db7f7d3b6c1514 (patch) | |
tree | 6849d2aa0446ce8a27b11e1707397da8df445fe2 /gcc/fortran/trans-array.c | |
parent | 92e948a836d98e98a1721008795dfddbb47828a6 (diff) | |
download | gcc-b8ff4e88e790df436088012ce6db7f7d3b6c1514.zip gcc-b8ff4e88e790df436088012ce6db7f7d3b6c1514.tar.gz gcc-b8ff4e88e790df436088012ce6db7f7d3b6c1514.tar.bz2 |
re PR fortran/18918 (Eventually support Fortran 2008's coarrays [co-arrays])
2011-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* trans-array.c (gfc_conv_array_ref): Handle pointer coarrays.
* trans-decl.c (has_coarray_vars, caf_init_block,
gfor_fndecl_caf_register): New file-global variables.
(gfc_finish_var_decl): Make sure that coarrays in main are static.
(gfc_build_qualified_array): Generate coarray token variable.
(gfc_get_symbol_decl): Don't use a static initializer for coarrays.
(gfc_build_builtin_function_decls): Set gfor_fndecl_caf_register.
(gfc_trans_deferred_vars, gfc_emit_parameter_debug_info): Skip for
static coarrays.
(generate_local_decl): Check for local coarrays.
(create_main_function): SYNC ALL before calling MAIN.
(generate_coarray_sym_init): Register static coarray.
(generate_coarray_init): Generate CAF registering constructor
function.
(gfc_generate_function_code): Call it, if needed, do not create
cgraph twice.
(gfc_generate_module_vars, gfc_process_block_locals): Call
generate_coarray_init.
* trans-types.c (gfc_get_nodesc_array_type): Generate pointers
* for
-fcoarray=lib.
* trans.h (gfor_fndecl_caf_register): New variable.
(lang_type): New element caf_token.
(GFC_TYPE_ARRAY_CAF_TOKEN): New macro.
2011-05-26 Tobias Burnus <burnus@net-b.de>
PR fortran/18918
* gfortran.dg/coarray/registering_1.f90: New.
From-SVN: r174301
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 78d65a6..29c7f83 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -2623,6 +2623,10 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_symbol * sym, if (ar->dimen == 0) { gcc_assert (ar->codimen); + if (GFC_ARRAY_TYPE_P (TREE_TYPE (se->expr)) + && TREE_CODE (TREE_TYPE (se->expr)) == POINTER_TYPE) + se->expr = build_fold_indirect_ref_loc (input_location, se->expr); + /* Use the actual tree type and not the wrapped coarray. */ se->expr = fold_convert (TREE_TYPE (TREE_TYPE (se->expr)), se->expr); return; |