From: Eric Botcazou <[email protected]>
The freezing machinery ends up inserting a freeze node into its own Actions
list, which causes Expand_N_Freeze_Entity to enter an endless loop, because
Remove_Init_Call incorrectly returns the initialization call of a different
variable than the one for which it was invoked.
gcc/ada/ChangeLog:
* exp_util.adb (Remove_Init_Call.Find_Init_Call_In_List): Check that
the first actual denotes the expected variable modulo qualification
and conversion.
Tested on x86_64-pc-linux-gnu, committed on master.
---
gcc/ada/exp_util.adb | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 7605ff9e576..d93e3b10017 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -12542,7 +12542,15 @@ package body Exp_Util is
and then Is_Entity_Name (Name (Init_Call))
and then Entity (Name (Init_Call)) = Init_Proc
then
- return Init_Call;
+ declare
+ Act : constant Node_Id :=
+ Unqual_Conv (First (Parameter_Associations (Init_Call)));
+
+ begin
+ if Is_Entity_Name (Act) and then Entity (Act) = Var then
+ return Init_Call;
+ end if;
+ end;
end if;
Next (Init_Call);
--
2.53.0