diff options
Diffstat (limited to 'gcc/c-family')
-rw-r--r-- | gcc/c-family/c-common.h | 4 | ||||
-rw-r--r-- | gcc/c-family/c-omp.cc | 23 |
2 files changed, 23 insertions, 4 deletions
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 3c2d75a..2d5f539 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -1373,8 +1373,8 @@ public: bool map_supported_p (); - static tree get_origin (tree); - static tree maybe_unconvert_ref (tree); + tree get_origin (tree); + tree maybe_unconvert_ref (tree); bool maybe_zero_length_array_section (tree); diff --git a/gcc/c-family/c-omp.cc b/gcc/c-family/c-omp.cc index 5bceb9c..5117022 100644 --- a/gcc/c-family/c-omp.cc +++ b/gcc/c-family/c-omp.cc @@ -2830,6 +2830,9 @@ c_omp_split_clauses (location_t loc, enum tree_code code, } else if (TREE_CODE (OMP_CLAUSE_DECL (c)) == TREE_LIST) { + /* TODO: This can go away once we transition all uses of + TREE_LIST for representing OMP array sections to + OMP_ARRAY_SECTION. */ tree t; for (t = OMP_CLAUSE_DECL (c); TREE_CODE (t) == TREE_LIST; t = TREE_CHAIN (t)) @@ -2838,6 +2841,17 @@ c_omp_split_clauses (location_t loc, enum tree_code code, bitmap_clear_bit (&allocate_head, DECL_UID (t)); break; } + else if (TREE_CODE (OMP_CLAUSE_DECL (c)) == OMP_ARRAY_SECTION) + { + tree t; + for (t = OMP_CLAUSE_DECL (c); + TREE_CODE (t) == OMP_ARRAY_SECTION; + t = TREE_OPERAND (t, 0)) + ; + if (DECL_P (t)) + bitmap_clear_bit (&allocate_head, DECL_UID (t)); + break; + } /* FALLTHRU */ case OMP_CLAUSE_PRIVATE: case OMP_CLAUSE_FIRSTPRIVATE: @@ -3379,6 +3393,7 @@ c_omp_address_inspector::map_supported_p () || TREE_CODE (t) == SAVE_EXPR || TREE_CODE (t) == POINTER_PLUS_EXPR || TREE_CODE (t) == NON_LVALUE_EXPR + || TREE_CODE (t) == OMP_ARRAY_SECTION || TREE_CODE (t) == NOP_EXPR) if (TREE_CODE (t) == COMPOUND_EXPR) t = TREE_OPERAND (t, 1); @@ -3408,7 +3423,8 @@ c_omp_address_inspector::get_origin (tree t) else if (TREE_CODE (t) == POINTER_PLUS_EXPR || TREE_CODE (t) == SAVE_EXPR) t = TREE_OPERAND (t, 0); - else if (TREE_CODE (t) == INDIRECT_REF + else if (!processing_template_decl_p () + && TREE_CODE (t) == INDIRECT_REF && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == REFERENCE_TYPE) t = TREE_OPERAND (t, 0); else @@ -3425,7 +3441,10 @@ c_omp_address_inspector::get_origin (tree t) tree c_omp_address_inspector::maybe_unconvert_ref (tree t) { - if (TREE_CODE (t) == INDIRECT_REF + /* Be careful not to dereference the type if we're processing a + template decl, else it might be NULL. */ + if (!processing_template_decl_p () + && TREE_CODE (t) == INDIRECT_REF && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == REFERENCE_TYPE) return TREE_OPERAND (t, 0); |