Skip to content

Commit

Permalink
ada: Improve handling of declare expressions in deferred-freezing con…
Browse files Browse the repository at this point in the history
…texts

In some cases where a declare expression occurs in a deferred-freezing
context (e.g., within the default value for a discriminant or for a formal
parameter, or within the expression of an expression function), the compiler
generates a bugbox.

gcc/ada/

	* sem_ch3.adb
	(Analyze_Object_Declaration): Do not perform expansion actions if
	In_Spec_Expression is true.
  • Loading branch information
swbaird authored and marc-adacore committed Nov 8, 2022
1 parent 270713d commit f2fa41b
Showing 1 changed file with 20 additions and 0 deletions.
20 changes: 20 additions & 0 deletions gcc/ada/sem_ch3.adb
Original file line number Diff line number Diff line change
Expand Up @@ -4721,6 +4721,26 @@ package body Sem_Ch3 is
Expand_Sliding_Conversion (E, T);
end if;

if In_Spec_Expression and then In_Declare_Expr > 0 then
-- It is too early to be doing expansion-ish things,
-- so exit early. But we have to set Ekind (Id) now so
-- that subsequent uses of this entity are not rejected
-- via the same mechanism that (correctly) rejects
-- "X : Integer := X;".

if Constant_Present (N) then
Mutate_Ekind (Id, E_Constant);
Set_Is_True_Constant (Id);
else
Mutate_Ekind (Id, E_Variable);
if Present (E) then
Set_Has_Initial_Value (Id);
end if;
end if;

goto Leave;
end if;

Expand_Subtype_From_Expr
(N => N,
Unc_Type => T,
Expand Down

0 comments on commit f2fa41b

Please sign in to comment.