We generate a temporary incorrectly-typed COMPONENT_REF in gigi when building a derived tagged type with discriminant. That's essentially harmless, but breaks the invariant that the type of the first operand of COMPONENT_REF is aggregate.
Tested on x86_64-suse-linux, applied on the mainline. 2012-08-19 Eric Botcazou <ebotca...@adacore.com> * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Type>: Use proper dummy type for the temporary COMPONENT_REF built for a derived tagged type with discriminant. -- Eric Botcazou
Index: gcc-interface/decl.c =================================================================== --- gcc-interface/decl.c (revision 190510) +++ gcc-interface/decl.c (working copy) @@ -2988,6 +2988,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entit if (Present (Parent_Subtype (gnat_entity))) { Entity_Id gnat_parent = Parent_Subtype (gnat_entity); + tree gnu_dummy_parent_type = make_node (RECORD_TYPE); tree gnu_parent; /* A major complexity here is that the parent subtype will @@ -2999,11 +3000,11 @@ gnat_to_gnu_entity (Entity_Id gnat_entit each of those discriminants to a COMPONENT_REF of the above dummy parent referencing the corresponding discriminant of the base type of the parent subtype. */ - gnu_get_parent = build3 (COMPONENT_REF, void_type_node, + gnu_get_parent = build3 (COMPONENT_REF, gnu_dummy_parent_type, build0 (PLACEHOLDER_EXPR, gnu_type), build_decl (input_location, FIELD_DECL, NULL_TREE, - void_type_node), + gnu_dummy_parent_type), NULL_TREE); if (has_discr)