diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index f914d0676d3..ee54d2742d5 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,12 @@ +2019-08-20 Ed Schonberg + + * 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 * exp_util.adb (Build_DIC_Procedure_Declaration): Set the last diff --git a/gcc/ada/exp_ch13.adb b/gcc/ada/exp_ch13.adb index f3c2c01240b..f3da4eefa1a 100644 --- a/gcc/ada/exp_ch13.adb +++ b/gcc/ada/exp_ch13.adb @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b330c78955a..f18ea5f7dd1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-08-20 Ed Schonberg + + * gnat.dg/storage_size1.adb: New testcase. + 2019-08-20 Ed Schonberg * gnat.dg/loop_entry2.adb: New testcase. diff --git a/gcc/testsuite/gnat.dg/storage_size1.adb b/gcc/testsuite/gnat.dg/storage_size1.adb new file mode 100644 index 00000000000..970caf16156 --- /dev/null +++ b/gcc/testsuite/gnat.dg/storage_size1.adb @@ -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;