diff options
author | Tobias Burnus <burnus@net-b.de> | 2015-01-27 20:57:55 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2015-01-27 20:57:55 +0100 |
commit | 710700abb804afc0846423ab246034dec745a599 (patch) | |
tree | 22f542a953ff70a841a13ba6dce2a744b4118c8e /gcc/fortran | |
parent | e23f28927f1922bd684d985901d13588a942fbd4 (diff) | |
download | gcc-710700abb804afc0846423ab246034dec745a599.zip gcc-710700abb804afc0846423ab246034dec745a599.tar.gz gcc-710700abb804afc0846423ab246034dec745a599.tar.bz2 |
re PR fortran/63861 (OpenACC coarray ICE (also with OpenMP?))
2015-01-27 Tobias Burnus <burnus@net-b.de>
PR fortran/63861
gcc/fortran/
* trans-openmp.c (gfc_has_alloc_comps, gfc_trans_omp_clauses):
Fix handling for scalar coarrays.
* trans-types.c (gfc_get_element_type): Add comment.
gcc/testsuite/
* gfortran.dg/goacc/coarray_2.f90: New.
From-SVN: r220189
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-openmp.c | 24 | ||||
-rw-r--r-- | gcc/fortran/trans-types.c | 4 |
3 files changed, 26 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 820aad5..13cd750 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2015-01-27 Tobias Burnus <burnus@net-b.de> + + PR fortran/63861 + * trans-openmp.c (gfc_has_alloc_comps, gfc_trans_omp_clauses): + Fix handling for scalar coarrays. + * trans-types.c (gfc_get_element_type): Add comment. + 2015-01-27 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> PR fortran/64771 diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index cdd1885..8da55d3 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -189,7 +189,7 @@ gfc_has_alloc_comps (tree type, tree decl) return false; } - while (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type)) + if (GFC_DESCRIPTOR_TYPE_P (type) || GFC_ARRAY_TYPE_P (type)) type = gfc_get_element_type (type); if (TREE_CODE (type) != RECORD_TYPE) @@ -1989,7 +1989,10 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, OMP_CLAUSE_DECL (node3) = gfc_conv_descriptor_data_get (decl); OMP_CLAUSE_SIZE (node3) = size_int (0); - if (n->sym->attr.pointer) + + /* We have to check for n->sym->attr.dimension because + of scalar coarrays. */ + if (n->sym->attr.pointer && n->sym->attr.dimension) { stmtblock_t cond_block; tree size @@ -2019,16 +2022,19 @@ gfc_trans_omp_clauses (stmtblock_t *block, gfc_omp_clauses *clauses, else_b)); OMP_CLAUSE_SIZE (node) = size; } - else + else if (n->sym->attr.dimension) OMP_CLAUSE_SIZE (node) = gfc_full_array_size (block, decl, GFC_TYPE_ARRAY_RANK (type)); - tree elemsz - = TYPE_SIZE_UNIT (gfc_get_element_type (type)); - elemsz = fold_convert (gfc_array_index_type, elemsz); - OMP_CLAUSE_SIZE (node) - = fold_build2 (MULT_EXPR, gfc_array_index_type, - OMP_CLAUSE_SIZE (node), elemsz); + if (n->sym->attr.dimension) + { + tree elemsz + = TYPE_SIZE_UNIT (gfc_get_element_type (type)); + elemsz = fold_convert (gfc_array_index_type, elemsz); + OMP_CLAUSE_SIZE (node) + = fold_build2 (MULT_EXPR, gfc_array_index_type, + OMP_CLAUSE_SIZE (node), elemsz); + } } else OMP_CLAUSE_DECL (node) = decl; diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 1ee490e..53da053 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1172,6 +1172,10 @@ gfc_conv_array_bound (gfc_expr * expr) return NULL_TREE; } +/* Return the type of an element of the array. Note that scalar coarrays + are special. In particular, for GFC_ARRAY_TYPE_P, the original argument + (with POINTER_TYPE stripped) is returned. */ + tree gfc_get_element_type (tree type) { |