summaryrefslogtreecommitdiff
path: root/gcc/ada/exp_dist.adb
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-29 14:32:43 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2011-08-29 14:32:43 +0000
commit1dceb63e5940445ceb877e01145ff4b1f5d5dc83 (patch)
tree5b0e00002daef44290edd3196cd25f963c17a158 /gcc/ada/exp_dist.adb
parent9b2f616e75a70722c37ba9728e3bd2ec7607ef35 (diff)
downloadgcc-1dceb63e5940445ceb877e01145ff4b1f5d5dc83.tar.gz
2011-08-29 Robert Dewar <dewar@adacore.com>
* impunit.adb, exp_ch4.adb, s-finmas.adb: Minor reformatting. 2011-08-29 Thomas Quinot <quinot@adacore.com> * exp_dist.adb (TC_Rec_Add_Process_Element): For a choice with multiple values, we generate multiple triples of parameters in the TypeCode. Bump Choice_Index for each such triple so that a subsequent default choice is associated with the correct index in the typecode. 2011-08-29 Ed Schonberg <schonberg@adacore.com> * a-cdlili.adb (Iterate): Initialize properly an iterator over a null container. (First, Last): Handle properly an iterator over a null container. 2011-08-29 Bob Duff <duff@adacore.com> * sem_ch10.adb (Analyze_With_Clause,Install_Withed_Unit): Abandon processing if we run across a node with no Scope. This can happen if we're with-ing an library-level instance, and that instance got errors that caused "instantiation abandoned". * sem_util.adb (Unit_Declaration_Node): Make it more robust, by raising an exception instead of using Assert, so it won't go into an infinite loop, even when assertions are turned off. 2011-08-29 Ed Schonberg <schonberg@adacore.com> * a-coorse.adb: Proper handling of empty ordered sets. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@178249 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/exp_dist.adb')
-rw-r--r--gcc/ada/exp_dist.adb46
1 files changed, 21 insertions, 25 deletions
diff --git a/gcc/ada/exp_dist.adb b/gcc/ada/exp_dist.adb
index df6ead34f9d..1f59c7ae09c 100644
--- a/gcc/ada/exp_dist.adb
+++ b/gcc/ada/exp_dist.adb
@@ -2084,8 +2084,7 @@ package body Exp_Dist is
is
N : constant Name_Id := Chars (Def);
- Overload_Order : constant Int :=
- Overload_Counter_Table.Get (N) + 1;
+ Overload_Order : constant Int := Overload_Counter_Table.Get (N) + 1;
begin
Overload_Counter_Table.Set (N, Overload_Order);
@@ -10429,7 +10428,7 @@ package body Exp_Dist is
-- A variant part
- declare
+ Variant_Part : declare
Disc_Type : constant Entity_Id := Etype (Name (Field));
Is_Enum : constant Boolean :=
@@ -10451,6 +10450,8 @@ package body Exp_Dist is
Dummy_Counter : Int := 0;
Choice_Index : Int := 0;
+ -- Index of current choice in TypeCode, used to identify
+ -- it as the default choice if it is a "when others".
procedure Add_Params_For_Variant_Components;
-- Add a struct TypeCode and a corresponding member name
@@ -10489,6 +10490,8 @@ package body Exp_Dist is
Add_String_Parameter (Name_Str, Union_TC_Params);
end Add_Params_For_Variant_Components;
+ -- Start of processing for Variant_Part
+
begin
Get_Name_String (U_Name);
Name_Str := String_From_Name_Buffer;
@@ -10547,6 +10550,8 @@ package body Exp_Dist is
Add_Params_For_Variant_Components;
J := J + Uint_1;
end loop;
+ Choice_Index :=
+ Choice_Index + UI_To_Int (H - L) + 1;
end;
when N_Others_Choice =>
@@ -10556,26 +10561,16 @@ package body Exp_Dist is
-- current choice index. This parameter is by
-- construction the 4th in Union_TC_Params.
- declare
- Default_Node : constant Node_Id :=
- Pick (Union_TC_Params, 4);
-
- New_Default_Node : constant Node_Id :=
- Make_Function_Call (Loc,
- Name =>
- New_Occurrence_Of
- (RTE (RE_TA_I32), Loc),
- Parameter_Associations =>
- New_List (
- Make_Integer_Literal (Loc,
- Intval => Choice_Index)));
-
- begin
- Insert_Before
- (Default_Node, New_Default_Node);
-
- Remove (Default_Node);
- end;
+ Replace
+ (Pick (Union_TC_Params, 4),
+ Make_Function_Call (Loc,
+ Name =>
+ New_Occurrence_Of
+ (RTE (RE_TA_I32), Loc),
+ Parameter_Associations =>
+ New_List (
+ Make_Integer_Literal (Loc,
+ Intval => Choice_Index))));
-- Add a placeholder member label for the
-- default case, which must have the
@@ -10594,6 +10589,7 @@ package body Exp_Dist is
end;
Add_Params_For_Variant_Components;
+ Choice_Index := Choice_Index + 1;
when others =>
@@ -10608,15 +10604,15 @@ package body Exp_Dist is
end;
Add_Params_For_Variant_Components;
+ Choice_Index := Choice_Index + 1;
end case;
Next (Choice);
- Choice_Index := Choice_Index + 1;
end loop;
Next_Non_Pragma (Variant);
end loop;
- end;
+ end Variant_Part;
end if;
end TC_Rec_Add_Process_Element;