ada: Fix internal error on declare expression in expression function
When the expression function is not a completion, its (return) expression does not cause freezing so analyzing the declare expression in this context must not freeze the type of the object. The change also contains another fix, which makes it so that the compiler does not evaluate a nonstatic representation attribute of a scalar subtype in the same context if the subtype is not already frozen. gcc/ada/ * sem_attr.adb (Eval_Attribute): Do not proceed in a spec expression for nonstatic representation attributes of a scalar subtype when the subtype is not frozen. * sem_ch3.adb (Analyze_Object_Declaration): Do not freeze the type of the object in a spec expression.
This commit is contained in:
parent
89ed545585
commit
e95a42ec9a
2 changed files with 23 additions and 2 deletions
|
@ -8693,6 +8693,26 @@ package body Sem_Attr is
|
|||
Set_Raises_Constraint_Error (N);
|
||||
end if;
|
||||
|
||||
-- RM 13.14(8/4): a nonstatic expression in a spec expression does
|
||||
-- not cause freezing, so the representation attributes cannot be
|
||||
-- evaluated at this point if the type is not already frozen.
|
||||
|
||||
if not Static
|
||||
and then In_Spec_Expression
|
||||
and then Id in Attribute_Alignment
|
||||
| Attribute_Component_Size
|
||||
| Attribute_Max_Alignment_For_Allocation
|
||||
| Attribute_Max_Size_In_Storage_Elements
|
||||
| Attribute_Object_Size
|
||||
| Attribute_Size
|
||||
| Attribute_Small
|
||||
| Attribute_VADS_Size
|
||||
| Attribute_Value_Size
|
||||
and then not Is_Frozen (P_Type)
|
||||
then
|
||||
return;
|
||||
end if;
|
||||
|
||||
-- Array case. We enforce the constrained requirement of (RM 4.9(7-8))
|
||||
-- since we can't do anything with unconstrained arrays. In addition,
|
||||
-- only the First, Last and Length attributes are possibly static.
|
||||
|
|
|
@ -4453,7 +4453,8 @@ package body Sem_Ch3 is
|
|||
|
||||
-- If not a deferred constant, then the object declaration freezes
|
||||
-- its type, unless the object is of an anonymous type and has delayed
|
||||
-- aspects. In that case the type is frozen when the object itself is.
|
||||
-- aspects (in that case the type is frozen when the object itself is)
|
||||
-- or the context is a spec expression.
|
||||
|
||||
else
|
||||
Check_Fully_Declared (T, N);
|
||||
|
@ -4463,7 +4464,7 @@ package body Sem_Ch3 is
|
|||
and then Is_Itype (T)
|
||||
then
|
||||
Set_Has_Delayed_Freeze (T);
|
||||
else
|
||||
elsif not In_Spec_Expression then
|
||||
Freeze_Before (N, T);
|
||||
end if;
|
||||
end if;
|
||||
|
|
Loading…
Add table
Reference in a new issue