[Ada] Use static discriminant value for discriminated task record

This patch allows the construction of a static subtype for the generated
constrained Secondary_Stack component of a task for which a stack size
is specified, when compiling for a restricted run-time that forbids
dynamic allocation. Needed for LLVM.

2019-09-18  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_ch3.adb (Constrain_Component_Type): For a discriminated
	type, handle the case of a constraint given by a conversion of a
	discriminant of the enclosing type. Necessary when compiling a
	discriminated task for a restricted run-time, when the generated
	Secondary_Stack component may be set by means of an aspect on
	the task type.

From-SVN: r275863
This commit is contained in:
Ed Schonberg 2019-09-18 08:33:32 +00:00 committed by Pierre-Marie de Rodat
parent b8411279b0
commit 0cff31f0f6
2 changed files with 29 additions and 1 deletions

View File

@ -1,3 +1,12 @@
2019-09-18 Ed Schonberg <schonberg@adacore.com>
* sem_ch3.adb (Constrain_Component_Type): For a discriminated
type, handle the case of a constraint given by a conversion of a
discriminant of the enclosing type. Necessary when compiling a
discriminated task for a restricted run-time, when the generated
Secondary_Stack component may be set by means of an aspect on
the task type.
2019-09-18 Ed Schonberg <schonberg@adacore.com>
* exp_aggr.adb (Expand_Record_Aggregate, Rewrite_Discriminant):

View File

@ -13258,7 +13258,9 @@ package body Sem_Ch3 is
function Build_Constrained_Discriminated_Type
(Old_Type : Entity_Id) return Entity_Id;
-- Ditto for record components
-- Ditto for record components. Handle the case where the constraint
-- is a conversion of the discriminant value, introduced during
-- expansion.
function Build_Constrained_Access_Type
(Old_Type : Entity_Id) return Entity_Id;
@ -13443,6 +13445,17 @@ package body Sem_Ch3 is
if Is_Discriminant (Expr) then
Need_To_Create_Itype := True;
-- After expansion of discriminated task types, the value
-- of the discriminant may be converted to a run-time type
-- for restricted run-times. Propagate the value of the
-- discriminant ss well, so that e.g. the secondary stack
-- component has a static constraint. Necessry for LLVM.
elsif Nkind (Expr) = N_Type_Conversion
and then Is_Discriminant (Expression (Expr))
then
Need_To_Create_Itype := True;
end if;
Next_Elmt (Old_Constraint);
@ -13457,6 +13470,12 @@ package body Sem_Ch3 is
if Is_Discriminant (Expr) then
Expr := Get_Discr_Value (Expr);
elsif Nkind (Expr) = N_Type_Conversion
and then Is_Discriminant (Expression (Expr))
then
Expr := New_Copy_Tree (Expr);
Set_Expression (Expr, Get_Discr_Value (Expression (Expr)));
end if;
Append (New_Copy_Tree (Expr), To => Constr_List);