diff options
Diffstat (limited to 'gcc/ada/exp_ch5.adb')
-rw-r--r-- | gcc/ada/exp_ch5.adb | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 971d0ad65d2..fd75b158449 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -1461,7 +1461,22 @@ package body Exp_Ch5 is end if; if Is_Unchecked_Union (Base_Type (R_Typ)) then - Insert_Action (N, Make_Field_Assign (CF, True)); + + -- Within an initialization procedure this is the + -- assignment to an unchecked union component, in which + -- case there is no discriminant to initialize. + + if Inside_Init_Proc then + null; + + else + -- The assignment is part of a conversion from a + -- derived unchecked union type with an inferable + -- discriminant, to a parent type. + + Insert_Action (N, Make_Field_Assign (CF, True)); + end if; + else Insert_Action (N, Make_Field_Assign (CF)); end if; @@ -3105,32 +3120,32 @@ package body Exp_Ch5 is end loop; -- Generate: - -- Id : Element_Type renames Pack.Element (Cursor); + -- Id : Element_Type renames Container (Cursor); + -- This assumes that the container type has an indexing + -- operation with Cursor. The check that this operation + -- exists is performed in Check_Container_Indexing. Decl := Make_Object_Renaming_Declaration (Loc, Defining_Identifier => Id, - Subtype_Mark => + Subtype_Mark => New_Reference_To (Element_Type, Loc), - Name => + Name => Make_Indexed_Component (Loc, - Prefix => Make_Selected_Component (Loc, - Prefix => New_Reference_To (Pack, Loc), - Selector_Name => - Make_Identifier (Loc, Chars => Name_Element)), + Prefix => Relocate_Node (Container_Arg), Expressions => New_List (New_Occurrence_Of (Cursor, Loc)))); -- If the container holds controlled objects, wrap the loop -- statements and element renaming declaration with a block. - -- This ensures that the result of Element (Iterator) is + -- This ensures that the result of Element (Cusor) is -- cleaned up after each iteration of the loop. if Needs_Finalization (Element_Type) then -- Generate: -- declare - -- Id : Element_Type := Pack.Element (Iterator); + -- Id : Element_Type := Pack.Element (curosr); -- begin -- <original loop statements> -- end; @@ -3264,9 +3279,11 @@ package body Exp_Ch5 is -- The Iterator is not modified in the source, but of course will -- be updated in the generated code. Indicate that it is actually - -- set to prevent spurious warnings. + -- set to prevent spurious warnings. Ditto for the Cursor, which + -- is modified indirectly in generated code. Set_Never_Set_In_Source (Iterator, False); + Set_Never_Set_In_Source (Cursor, False); -- If the range of iteration is given by a function call that -- returns a container, the finalization actions have been saved |