[COMMITTED] ada: Fix internal error on class-wide allocator inside if-expression

Message ID 20240109131549.744564-1-poulhies@adacore.com
State Accepted
Headers
Series [COMMITTED] ada: Fix internal error on class-wide allocator inside if-expression |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Marc Poulhiès Jan. 9, 2024, 1:15 p.m. UTC
  From: Eric Botcazou <ebotcazou@adacore.com>

The problem is that the freeze node for the class-wide subtype built for the
expression of the allocator escapes from the dependent expression instead of
being stored in its list of actions.

gcc/ada/

	* freeze.adb (Freeze_Expression.Has_Decl_In_List): Deal specifically
	with itypes that are class-wide subtypes.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/freeze.adb | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)
  

Patch

diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index 26b5589a020..468d6ee6dbe 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -8141,10 +8141,19 @@  package body Freeze is
          Decl_Node : Node_Id;
 
       begin
-         --  If E is an itype, pretend that it is declared in N
+         --  If E is an itype, pretend that it is declared in N except for a
+         --  class-wide subtype with an equivalent type, because this latter
+         --  type comes with a bona-fide declaration node.
 
          if Is_Itype (E) then
-            Decl_Node := N;
+            if Ekind (E) = E_Class_Wide_Subtype
+              and then Present (Equivalent_Type (E))
+            then
+               Decl_Node := Declaration_Node (Equivalent_Type (E));
+            else
+               Decl_Node := N;
+            end if;
+
          else
             Decl_Node := Declaration_Node (E);
          end if;