+2012-07-19 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: 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 <ebotcazou@adacore.com>
* gcc-interface/trans.c (stmt_group_may_fallthru): New function.
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);
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
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;
/* 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;
--- /dev/null
+-- { dg-do compile }\r
+\r
+procedure Discr38 is\r
+\r
+ type Enum is (OK,\r
+ NOT_CONNECTED,\r
+ DISCONNECTED,\r
+ REQUEST_Q_EMPTY,\r
+ SERVER_UNAVAILABLE,\r
+ BUFFER_TOO_SMALL,\r
+ NO_FREE_SLOT,\r
+ RAISE_EXCEPTION,\r
+ REQUEST_CANCELLED,\r
+ REQUEST_IN_PROGRESS,\r
+ SERVER_BUSY,\r
+ BLOCK_ACKNOWLEDGE);\r
+\r
+ type R (Status : Enum := OK) is record\r
+ Status_Block : Integer;\r
+ case Status is\r
+ when RAISE_EXCEPTION =>\r
+ I : Integer;\r
+ when OK =>\r
+ Length : Natural;\r
+ Data : Integer;\r
+ when others =>\r
+ null;\r
+ end case;\r
+ end record;\r
+ for R use record\r
+ Status at 0 range 0 .. 7;\r
+ Status_Block at 4 range 0 .. 31;\r
+ Length at 8 range 0 .. 31;\r
+ end record;\r
+\r
+ Nil : constant R := (OK, 1, 0, 1);\r
+\r
+begin\r
+ null;\r
+end;\r