[Ada] Crash on a Storage_Size aspect depending on attr. of another type

This patch fixes a crash on an aspect specification for Storage_Size for
a type T when the expression for the aspect depends on attributes of a
previously declared type that is not frozen yet. The  temporary
declaration that captures the value of the aspect must be part of the
actions attached to the freeze node for T.

2019-08-20  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* exp_ch13.adb (Expand_N_Attribute_Definition_Clause, case
	Storage_Size): If the expression for Storage_Size is not static
	it may depend on characterstics of another type that may bot be
	frozen yet, so the elaboration of the expression for the aspect
	must be attached directly to the freeze actions of the type to
	which it applies.

gcc/testsuite/

	* gnat.dg/storage_size1.adb: New testcase.

From-SVN: r274742
This commit is contained in:
Ed Schonberg 2019-08-20 09:50:38 +00:00 committed by Pierre-Marie de Rodat
parent aa090e20d4
commit b82f1618c4
4 changed files with 61 additions and 9 deletions

View file

@ -1,3 +1,12 @@
2019-08-20 Ed Schonberg <schonberg@adacore.com>
* exp_ch13.adb (Expand_N_Attribute_Definition_Clause, case
Storage_Size): If the expression for Storage_Size is not static
it may depend on characterstics of another type that may bot be
frozen yet, so the elaboration of the expression for the aspect
must be attached directly to the freeze actions of the type to
which it applies.
2019-08-20 Piotr Trojanek <trojanek@adacore.com>
* exp_util.adb (Build_DIC_Procedure_Declaration): Set the last

View file

@ -220,9 +220,9 @@ package body Exp_Ch13 is
-- task_typeZ := expression
if Ekind (Ent) = E_Task_Type then
declare
Assign : Node_Id;
begin
Assign :=
Make_Assignment_Statement (Loc,
@ -261,15 +261,35 @@ package body Exp_Ch13 is
Make_Defining_Identifier (Loc,
Chars => New_External_Name (Chars (Ent), 'V'));
-- Insert the declaration of the object
-- Insert the declaration of the object. If the expression
-- is not static it may depend on some other type that is
-- not frozen yet, so attach the declaration that captures
-- the value of the expression to the actions of the freeze
-- node of the current type.
Insert_Action (N,
Make_Object_Declaration (Loc,
Defining_Identifier => V,
Object_Definition =>
New_Occurrence_Of (RTE (RE_Storage_Offset), Loc),
Expression =>
Convert_To (RTE (RE_Storage_Offset), Expression (N))));
declare
Decl : constant Node_Id :=
Make_Object_Declaration (Loc,
Defining_Identifier => V,
Object_Definition =>
New_Occurrence_Of (RTE (RE_Storage_Offset), Loc),
Expression =>
Convert_To
(RTE (RE_Storage_Offset), Expression (N)));
begin
if not Is_OK_Static_Expression (Expression (N))
and then Present (Freeze_Node (Ent))
then
if No (Actions (Freeze_Node (Ent))) then
Set_Actions (Freeze_Node (Ent), New_List (Decl));
else
Append (Decl, Actions (Freeze_Node (Ent)));
end if;
else
Insert_Action (N, Decl);
end if;
end;
Set_Storage_Size_Variable (Ent, Entity_Id (V));
end if;

View file

@ -1,3 +1,7 @@
2019-08-20 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/storage_size1.adb: New testcase.
2019-08-20 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/loop_entry2.adb: New testcase.

View file

@ -0,0 +1,19 @@
-- { dg-do compile }
with Ada.Text_IO; with Ada.Integer_Text_IO;
procedure Storage_Size1 is
package O renames Ada.Text_IO;
package T renames Ada.Integer_Text_IO;
type Struct is record first, second: Integer; end record;
type SP is access Struct
with Storage_Size => 64 * Struct'Max_Size_In_Storage_Elements;
begin
T.Put(SP'Storage_Size); O.New_Line(1);
end Storage_Size1;