https://gcc.gnu.org/g:9cf95147c04c64344466f6e41ce5be32fbde96e0

commit r15-1489-g9cf95147c04c64344466f6e41ce5be32fbde96e0
Author: Eric Botcazou <ebotca...@adacore.com>
Date:   Mon May 20 14:33:14 2024 +0200

    ada: Fix crash on real literal in declare expression of expression function
    
    The problem is that the freeze node of the type to which the real literal
    is resolved is placed inside the expression function instead of outside.
    
    gcc/ada/
    
            * freeze.adb (Freeze_Expression): Also attach pending freeze nodes
            to the parent in the case of an internal block in a spec expression.

Diff:
---
 gcc/ada/freeze.adb | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb
index 3c3d038c3925..1867880b314b 100644
--- a/gcc/ada/freeze.adb
+++ b/gcc/ada/freeze.adb
@@ -8872,7 +8872,8 @@ package body Freeze is
             end if;
 
             --  The current scope may be that of a constrained component of
-            --  an enclosing record declaration, or of a loop of an enclosing
+            --  an enclosing record declaration, or a block of an enclosing
+            --  declare expression in Ada 2022, or of a loop of an enclosing
             --  quantified expression or aggregate with an iterated component
             --  in Ada 2022, which is above the current scope in the scope
             --  stack. Indeed in the context of a quantified expression or
@@ -8884,7 +8885,7 @@ package body Freeze is
 
             if not Is_Compilation_Unit (Current_Scope)
               and then (Is_Record_Type (Scope (Current_Scope))
-                         or else (Ekind (Current_Scope) = E_Loop
+                         or else (Ekind (Current_Scope) in E_Block | E_Loop
                                    and then Is_Internal (Current_Scope)))
             then
                Pos := Pos - 1;

Reply via email to