aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2023-01-27 15:13:07 +0100
committerMarc Poulhiès <poulhies@adacore.com>2023-05-16 10:30:58 +0200
commit5f8a29bd3487a60cf513c4976769b7dc0113f227 (patch)
tree52ec480ea2801b69e2e7dd6a90d15c42df7fa44c /gcc
parent8ebdd4431829c61228ec92f906cb9f7a2141325f (diff)
downloadgcc-5f8a29bd3487a60cf513c4976769b7dc0113f227.zip
gcc-5f8a29bd3487a60cf513c4976769b7dc0113f227.tar.gz
gcc-5f8a29bd3487a60cf513c4976769b7dc0113f227.tar.bz2
ada: Fix internal error on chain of predicated record types
The preanalysis of a predicate set on one of the record types was causing premature freezing of another record type. gcc/ada/ * sem_ch13.adb: Add with and use clauses for Expander. (Resolve_Aspect_Expressions) <Aspect_Predicate>: Emulate a bona-fide preanalysis setup before calling Resolve_Aspect_Expression.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/sem_ch13.adb27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index 1c75722..a4a5084 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -38,6 +38,7 @@ with Exp_Ch3; use Exp_Ch3;
with Exp_Disp; use Exp_Disp;
with Exp_Tss; use Exp_Tss;
with Exp_Util; use Exp_Util;
+with Expander; use Expander;
with Freeze; use Freeze;
with Ghost; use Ghost;
with Lib; use Lib;
@@ -15625,15 +15626,29 @@ package body Sem_Ch13 is
-- Preanalyze expression after type replacement to catch
-- name resolution errors if the predicate function has
-- not been built yet.
+
-- Note that we cannot use Preanalyze_Spec_Expression
- -- because of the special handling required for
- -- quantifiers, see comments on Resolve_Aspect_Expression
- -- above.
+ -- directly because of the special handling required for
+ -- quantifiers (see comments on Resolve_Aspect_Expression
+ -- above) but we need to emulate it properly.
if No (Predicate_Function (E)) then
- Push_Type (E);
- Resolve_Aspect_Expression (Expr);
- Pop_Type (E);
+ declare
+ Save_In_Spec_Expression : constant Boolean :=
+ In_Spec_Expression;
+ Save_Full_Analysis : constant Boolean :=
+ Full_Analysis;
+ begin
+ In_Spec_Expression := True;
+ Full_Analysis := False;
+ Expander_Mode_Save_And_Set (False);
+ Push_Type (E);
+ Resolve_Aspect_Expression (Expr);
+ Pop_Type (E);
+ Expander_Mode_Restore;
+ Full_Analysis := Save_Full_Analysis;
+ In_Spec_Expression := Save_In_Spec_Expression;
+ end;
end if;
when Pre_Post_Aspects =>