aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2022-05-24 16:03:58 -0700
committerPierre-Marie de Rodat <derodat@adacore.com>2022-07-04 07:45:54 +0000
commit063c8f4c01bc1a5e6960c8624077df7137dc5dad (patch)
tree543c17e33905d5c5a3bb934dab64c17093adc330
parentf7c05e82037356ac4610e9e5d1365b345a17d0f7 (diff)
downloadgcc-063c8f4c01bc1a5e6960c8624077df7137dc5dad.zip
gcc-063c8f4c01bc1a5e6960c8624077df7137dc5dad.tar.gz
gcc-063c8f4c01bc1a5e6960c8624077df7137dc5dad.tar.bz2
[Ada] Compiler rejects legal allocator in record component constraint expression
In some cases when a legal allocator which defines a new subtype for the allocated object occurs as part of a record component constraint expression, the compiler would incorrectly reject the allocator. gcc/ada/ * sem_ch4.adb (Analyze_Allocator): After calling Insert_Action to insert a subtype declaration associated with an allocator, the subtype declaration will usually be analyzed. But not always. Add an explicit call to Preanalyze to cope with the unusual case. The subtype declaration must be at least preanalyzed before the call to Sem_Ch3.Process_Subtype a little while later, during which we analyze an identifier that refers to the subtype.
-rw-r--r--gcc/ada/sem_ch4.adb17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb
index 8fe2077..4bc3696 100644
--- a/gcc/ada/sem_ch4.adb
+++ b/gcc/ada/sem_ch4.adb
@@ -670,10 +670,19 @@ package body Sem_Ch4 is
then
Def_Id := Make_Temporary (Loc, 'S');
- Insert_Action (E,
- Make_Subtype_Declaration (Loc,
- Defining_Identifier => Def_Id,
- Subtype_Indication => Relocate_Node (E)));
+ declare
+ Subtype_Decl : constant Node_Id :=
+ Make_Subtype_Declaration (Loc,
+ Defining_Identifier => Def_Id,
+ Subtype_Indication => Relocate_Node (E));
+ begin
+ Insert_Action (E, Subtype_Decl);
+
+ -- Handle unusual case where Insert_Action does not
+ -- analyze the declaration. Subtype_Decl must be
+ -- preanalyzed before call to Process_Subtype below.
+ Preanalyze (Subtype_Decl);
+ end;
if Sav_Errs /= Serious_Errors_Detected
and then Nkind (Constraint (E)) =