diff options
author | Ed Schonberg <schonberg@adacore.com> | 2015-05-26 08:10:46 +0000 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2015-05-26 10:10:46 +0200 |
commit | ffcfb997e0a400614011e8f8b28f30eb68d1966a (patch) | |
tree | 5a7525cd8c5e3f1f9850268be0bc98b61505dfd4 /gcc | |
parent | 551e193501cebca18c19ed9ede7df7c2ee0bd9a6 (diff) | |
download | gcc-ffcfb997e0a400614011e8f8b28f30eb68d1966a.zip gcc-ffcfb997e0a400614011e8f8b28f30eb68d1966a.tar.gz gcc-ffcfb997e0a400614011e8f8b28f30eb68d1966a.tar.bz2 |
exp_aggr.adb (Build_Array_Aggr_Code, Gen_Assign): If a component is default-initialized and its type has an invariant procedure...
2015-05-26 Ed Schonberg <schonberg@adacore.com>
* exp_aggr.adb (Build_Array_Aggr_Code, Gen_Assign):
If a component is default-initialized and its type has an
invariant procedure, insert an invariant test after code for
default-initialization of the component.
From-SVN: r223664
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/exp_aggr.adb | 44 |
2 files changed, 34 insertions, 17 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index ccdf46b..da38705 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2015-05-26 Ed Schonberg <schonberg@adacore.com> + + * exp_aggr.adb (Build_Array_Aggr_Code, Gen_Assign): + If a component is default-initialized and its type has an + invariant procedure, insert an invariant test after code for + default-initialization of the component. + 2015-05-26 Gary Dismukes <dismukes@adacore.com> * einfo.ads, sem_util.adb, sem_ch4.adb: Minor reformatting. diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 8651074..3e20063 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -1160,11 +1160,21 @@ package body Exp_Aggr is Typ => Ctype, With_Default_Init => True)); + -- If the component type has invariants, add an invariant + -- check after the component is default-initialized. It will + -- be analyzed and resolved before the code for initialization + -- of other components. + + if Has_Invariants (Ctype) then + Set_Etype (Indexed_Comp, Ctype); + Append_To (L, Make_Invariant_Call (Indexed_Comp)); + end if; + elsif Is_Access_Type (Ctype) then Append_To (L, - Make_Assignment_Statement (Loc, - Name => Indexed_Comp, - Expression => Make_Null (Loc))); + Make_Assignment_Statement (Loc, + Name => Indexed_Comp, + Expression => Make_Null (Loc))); end if; if Needs_Finalization (Ctype) then @@ -1392,7 +1402,7 @@ package body Exp_Aggr is L_Range := Make_Range (Loc, - Low_Bound => L_L, + Low_Bound => L_L, High_Bound => L_H); -- Construct "for L_J in Index_Base range L .. H" @@ -1911,8 +1921,7 @@ package body Exp_Aggr is return Duplicate_Subexpr (Expression (Assoc)); end if; - Corresp_Disc := - Corresponding_Discriminant (Corresp_Disc); + Corresp_Disc := Corresponding_Discriminant (Corresp_Disc); end loop; end if; @@ -1954,8 +1963,7 @@ package body Exp_Aggr is while Present (Corresp_Disc) and then Disc /= Corresp_Disc loop - Corresp_Disc := - Corresponding_Discriminant (Corresp_Disc); + Corresp_Disc := Corresponding_Discriminant (Corresp_Disc); end loop; if Disc = Corresp_Disc then @@ -1984,8 +1992,10 @@ package body Exp_Aggr is if No (Assoc_Elmt) then Next (Assoc); + else Next_Elmt (Assoc_Elmt); + if Present (Assoc_Elmt) then Assoc := Node (Assoc_Elmt); else @@ -2022,7 +2032,7 @@ package body Exp_Aggr is if Present (Disc_Value) then Cond := Make_Op_Ne (Loc, - Left_Opnd => + Left_Opnd => Make_Selected_Component (Loc, Prefix => New_Copy_Tree (Target), Selector_Name => New_Occurrence_Of (Discr, Loc)), @@ -2504,7 +2514,7 @@ package body Exp_Aggr is -- expansion, which was delayed. if Nkind_In (Unqualify (Ancestor), N_Aggregate, - N_Extension_Aggregate) + N_Extension_Aggregate) then Set_Analyzed (Ancestor, False); Set_Analyzed (Expression (Ancestor), False); @@ -2530,9 +2540,9 @@ package body Exp_Aggr is if Tagged_Type_Expansion then Instr := Make_OK_Assignment_Statement (Loc, - Name => + Name => Make_Selected_Component (Loc, - Prefix => New_Copy_Tree (Target), + Prefix => New_Copy_Tree (Target), Selector_Name => New_Occurrence_Of (First_Tag_Component (Base_Type (Typ)), Loc)), @@ -2617,10 +2627,10 @@ package body Exp_Aggr is Selector_Name => New_Occurrence_Of (Discriminant, Loc)); Discriminant_Value := - Get_Discriminant_Value ( - Discriminant, - N_Typ, - Discriminant_Constraint (N_Typ)); + Get_Discriminant_Value + (Discriminant, + N_Typ, + Discriminant_Constraint (N_Typ)); Instr := Make_OK_Assignment_Statement (Loc, @@ -2670,7 +2680,7 @@ package body Exp_Aggr is if Present (CPP_Init_Proc (T)) then Append_To (L, Make_Procedure_Call_Statement (Loc, - New_Occurrence_Of (CPP_Init_Proc (T), Loc))); + Name => New_Occurrence_Of (CPP_Init_Proc (T), Loc))); end if; end Invoke_IC_Proc; |