[COMMITTED] ada: Fix internal error on class-wide allocator inside if-expression
Checks
Commit Message
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(-)
@@ -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;