diff options
author | Ed Schonberg <schonberg@adacore.com> | 2021-01-09 16:57:21 -0500 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-05-05 04:19:01 -0400 |
commit | 052a00e8943d088aab64140bcda671b9eba54e47 (patch) | |
tree | b99b21b19ce17d61ad77ada5dc4a150d86e5b219 | |
parent | 0bfcf0b33d3198cbd6072191815104f9431fc330 (diff) | |
download | gcc-052a00e8943d088aab64140bcda671b9eba54e47.zip gcc-052a00e8943d088aab64140bcda671b9eba54e47.tar.gz gcc-052a00e8943d088aab64140bcda671b9eba54e47.tar.bz2 |
[Ada] Handle defaults in declare_expressions in postconditions
gcc/ada/
* sem_ch3.adb (Find_Type_Of_Object): When In_Spec_Expression is
set and the object declaration generates a subtype indication,
build the corresponding subtype declaration and place it in tree
without the use of Insert_Actions, which is disabled in this
context.
-rw-r--r-- | gcc/ada/sem_ch3.adb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 5a3d206..d312a01 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -17827,6 +17827,44 @@ package body Sem_Ch3 is T := Make_Defining_Identifier (Sloc (P), Nam); + -- If In_Spec_Expression, for example within a pre/postcondition, + -- provide enough information for use of the subtype without + -- depending on full analysis and freezing, which will happen when + -- building the correspondiing subprogram. + + if In_Spec_Expression then + Analyze (Subtype_Mark (Obj_Def)); + + declare + Base_T : constant Entity_Id := Entity (Subtype_Mark (Obj_Def)); + Decl : constant Node_Id := + Make_Subtype_Declaration (Sloc (P), + Defining_Identifier => T, + Subtype_Indication => Relocate_Node (Obj_Def)); + begin + Set_Etype (T, Base_T); + Set_Ekind (T, Subtype_Kind (Ekind (Base_T))); + Set_Parent (T, Obj_Def); + + if Ekind (T) = E_Array_Subtype then + Set_First_Index (T, First_Index (Base_T)); + Set_Is_Constrained (T); + + elsif Ekind (T) = E_Record_Subtype then + Set_First_Entity (T, First_Entity (Base_T)); + Set_Has_Discriminants (T, Has_Discriminants (Base_T)); + Set_Is_Constrained (T); + end if; + + Insert_Before (Related_Nod, Decl); + end; + + return T; + end if; + + -- When generating code, insert subtype declaration ahead of + -- declaration that generated it. + Insert_Action (Obj_Def, Make_Subtype_Declaration (Sloc (P), Defining_Identifier => T, |