From 638eeae8042febc7cf5b01b9330558543e874f58 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 19 Jul 2012 15:44:00 +0000 Subject: [PATCH] decl.c (gnat_to_gnu_entity): Do not look up the REP part of the base type in advance. * gcc-interface/decl.c (gnat_to_gnu_entity) : Do not look up the REP part of the base type in advance. Deal with that of the variant types. (get_rep_part): Be prepared for record types with fields. From-SVN: r189666 --- gcc/ada/ChangeLog | 7 ++++++ gcc/ada/gcc-interface/decl.c | 12 +++++----- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/discr38.adb | 40 +++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/discr38.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 8f3ec641509..be2733b80a0 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2012-07-19 Eric Botcazou + + * gcc-interface/decl.c (gnat_to_gnu_entity) : Do not + look up the REP part of the base type in advance. Deal with that of + the variant types. + (get_rep_part): Be prepared for record types with fields. + 2012-07-18 Eric Botcazou * gcc-interface/trans.c (stmt_group_may_fallthru): New function. diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index ef7c87c366e..2aa20e77a1f 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -3287,9 +3287,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) else gnu_unpad_base_type = gnu_base_type; - /* Look for a REP part in the base type. */ - gnu_rep_part = get_rep_part (gnu_unpad_base_type); - /* Look for a variant part in the base type. */ gnu_variant_part = get_variant_part (gnu_unpad_base_type); @@ -3415,7 +3412,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) and put the field either in the new type if there is a selected variant or in one of the new variants. */ if (gnu_context == gnu_unpad_base_type - || (gnu_rep_part + || ((gnu_rep_part = get_rep_part (gnu_unpad_base_type)) && gnu_context == TREE_TYPE (gnu_rep_part))) gnu_cont_type = gnu_type; else @@ -3425,7 +3422,9 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) t = NULL_TREE; FOR_EACH_VEC_ELT (variant_desc, gnu_variant_list, i, v) - if (v->type == gnu_context) + if (gnu_context == v->type + || ((gnu_rep_part = get_rep_part (v->type)) + && gnu_context == TREE_TYPE (gnu_rep_part))) { t = v->type; break; @@ -8172,7 +8171,8 @@ get_rep_part (tree record_type) /* The REP part is the first field, internal, another record, and its name starts with an 'R'. */ - if (DECL_INTERNAL_P (field) + if (field + && DECL_INTERNAL_P (field) && TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE && IDENTIFIER_POINTER (DECL_NAME (field)) [0] == 'R') return field; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3283840121f..e7aac5f5f08 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-07-19 Eric Botcazou + + * gnat.dg/discr38.adb: New test. + 2012-07-19 Jakub Jelinek PR middle-end/54017 diff --git a/gcc/testsuite/gnat.dg/discr38.adb b/gcc/testsuite/gnat.dg/discr38.adb new file mode 100644 index 00000000000..363d2c6f606 --- /dev/null +++ b/gcc/testsuite/gnat.dg/discr38.adb @@ -0,0 +1,40 @@ +-- { dg-do compile } + +procedure Discr38 is + + type Enum is (OK, + NOT_CONNECTED, + DISCONNECTED, + REQUEST_Q_EMPTY, + SERVER_UNAVAILABLE, + BUFFER_TOO_SMALL, + NO_FREE_SLOT, + RAISE_EXCEPTION, + REQUEST_CANCELLED, + REQUEST_IN_PROGRESS, + SERVER_BUSY, + BLOCK_ACKNOWLEDGE); + + type R (Status : Enum := OK) is record + Status_Block : Integer; + case Status is + when RAISE_EXCEPTION => + I : Integer; + when OK => + Length : Natural; + Data : Integer; + when others => + null; + end case; + end record; + for R use record + Status at 0 range 0 .. 7; + Status_Block at 4 range 0 .. 31; + Length at 8 range 0 .. 31; + end record; + + Nil : constant R := (OK, 1, 0, 1); + +begin + null; +end; -- 2.30.2