aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2021-01-09 16:57:21 -0500
committerPierre-Marie de Rodat <derodat@adacore.com>2021-05-05 04:19:01 -0400
commit052a00e8943d088aab64140bcda671b9eba54e47 (patch)
treeb99b21b19ce17d61ad77ada5dc4a150d86e5b219 /gcc/ada
parent0bfcf0b33d3198cbd6072191815104f9431fc330 (diff)
downloadgcc-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.
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/sem_ch3.adb38
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,