From b82f1618c4e8ca7dca229d1337e44873386561dc Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 20 Aug 2019 09:50:38 +0000 Subject: [PATCH] [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 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 --- gcc/ada/ChangeLog | 9 ++++++ gcc/ada/exp_ch13.adb | 40 ++++++++++++++++++------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gnat.dg/storage_size1.adb | 19 ++++++++++++ 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/storage_size1.adb 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_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)))); + -- 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. + + 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; -- 2.30.2