diff options
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 05be419..2ed68d4 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -3056,7 +3056,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) gnat_field = Next_Stored_Discriminant (gnat_field)) if (Present (Corresponding_Discriminant (gnat_field))) { - Entity_Id field = Empty; + Entity_Id field; for (field = First_Stored_Discriminant (gnat_parent); Present (field); field = Next_Stored_Discriminant (field)) @@ -3138,8 +3138,30 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) && Ekind (Entity (Node (gnat_constr))) == E_Discriminant) { Entity_Id gnat_discr = Entity (Node (gnat_constr)); - tree gnu_discr_type = gnat_to_gnu_type (Etype (gnat_discr)); - tree gnu_ref + tree gnu_discr_type, gnu_ref; + + /* If the scope of the discriminant is not the record type, + this means that we're processing the implicit full view + of a type derived from a private discriminated type: in + this case, the Stored_Constraint list is simply copied + from the partial view, see Build_Derived_Private_Type. + So we need to retrieve the corresponding discriminant + of the implicit full view, otherwise we will abort. */ + if (Scope (gnat_discr) != gnat_entity) + { + Entity_Id field; + for (field = First_Entity (gnat_entity); + Present (field); + field = Next_Entity (field)) + if (Ekind (field) == E_Discriminant + && same_discriminant_p (gnat_discr, field)) + break; + gcc_assert (Present (field)); + gnat_discr = field; + } + + gnu_discr_type = gnat_to_gnu_type (Etype (gnat_discr)); + gnu_ref = gnat_to_gnu_entity (Original_Record_Component (gnat_discr), NULL_TREE, 0); |