Hi Tobias, in (look for ^^^):
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c index 063d4c145e2..705cdc7749f 100644 --- a/gcc/fortran/trans-openmp.c +++ b/gcc/fortran/trans-openmp.c @@ -355,6 +355,51 @@ gfc_has_alloc_comps (tree type, tree decl) return false; } +/* Return true if TYPE is polymorphic but not with pointer attribute. */ + +static bool +gfc_is_polymorphic_nonptr (tree type) +{ + if (POINTER_TYPE_P (type)) + type = TREE_TYPE (type); + if (TREE_CODE (type) != RECORD_TYPE) + return false; + + tree field = TYPE_FIELDS (type); + if (!field || 0 != strcmp ("_data", IDENTIFIER_POINTER (DECL_NAME (field)))) ^^^ here you are comparing the field - name + return false; + field = DECL_CHAIN (field); + if (!field || 0 != strcmp ("_vptr", IDENTIFIER_POINTER (DECL_NAME (field)))) + return false; + + return true; +} + +/* Return true if TYPE is unlimited polymorphic but not with pointer attribute; + unlimited means also intrinsic types are handled and _len is used. */ + +static bool +gfc_is_unlimited_polymorphic_nonptr (tree type) +{ + if (POINTER_TYPE_P (type)) + type = TREE_TYPE (type); + if (TREE_CODE (type) != RECORD_TYPE) + return false; + + tree field = TYPE_FIELDS (type); /* _data */ + if (!field) ^^^ here you don't . So theoretically this routine could match a type which has a _len as its third field, but that is not a unlim-poly class. Maybe factor out the test from the above routine and unify with this one to reuse the test for a BT_CLASS?! + return false; + field = DECL_CHAIN (field); /* _vptr */ + if (!field) + return false; + field = DECL_CHAIN (field); + if (!field || 0 != strcmp ("_len", IDENTIFIER_POINTER (DECL_NAME (field)))) + return false; + + return true; +} + + --------------------------------------------------------------------------------------------------------------- Btw, I believe the first routine can be better replaced by: static bool gfc_is_polymorphic_nonptr (tree type) { if (POINTER_TYPE_P (type)) type = TREE_TYPE (type); return GFC_CLASS_TYPE_P (type); } I have no better solution for learning whether a tree's type is unlimited poly yet. @@ -740,6 +785,87 @@ gfc_omp_clause_copy_ctor (tree clause, tree dest, tree src) gcc_assert (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_FIRSTPRIVATE || OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_LINEAR); + /* TODO: implement support for polymorphic arrays; reject for now. */ + /* Void arrays appear as var.0 = var._data.data. A bit hackish to + distinguish from 'type(c_ptr) :: var(5)' by scanning for '.'; + this assumes that ASM_FORMAT_PRIVATE_NAME uses a '.', which most + systems do. */ + if (TREE_CODE (type) == ARRAY_TYPE + && TREE_TYPE (type) == pvoid_type_node + && TREE_CODE (dest) == MEM_REF + && strchr (IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (dest, 0))), '.')) + fatal_error (input_location, + "Sorry, polymorphic arrays not yet supported for " + "firstprivate"); I totally agree that this is hackish and I don't like for that. But I can't come up with a better solution at the moment. The remainder looks ok to me. Regards, Andre -- Andre Vehreschild * Email: vehre ad gmx dot de