From 0d736433f9261fb9705f860a2e41cc407ecd972c Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 12 Dec 2024 23:08:30 +0100 Subject: [PATCH] ada: Fix predicate involving array indexing rejected in generic package The indexing is rejected with the message: error: reference to current instance of type does not denote a type when it is applied to a prefix which is the current instance of the type to which the predicate is applied. There is already a specific handling of component selection for this case present in Find_Selected_Component, so this adds an equivalent specific handling of indexing for this case to Analyze_Indexed_Component_Form. gcc/ada/ChangeLog: PR ada/117569 * sem_ch4.adb (Analyze_Indexed_Component_Form): Do not rewrite the node as a type conversion if it is the current instance of a type in a generic unit. * sem_ch8.adb (Find_Selected_Component): Restrict the special case of the current instance of a type to a generic unit. --- gcc/ada/sem_ch4.adb | 10 +++++++--- gcc/ada/sem_ch8.adb | 9 ++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/gcc/ada/sem_ch4.adb b/gcc/ada/sem_ch4.adb index 94e43429814..7bd30d6993e 100644 --- a/gcc/ada/sem_ch4.adb +++ b/gcc/ada/sem_ch4.adb @@ -3064,10 +3064,14 @@ package body Sem_Ch4 is if Is_Entity_Name (P) and then Present (Entity (P)) then U_N := Entity (P); - if Is_Type (U_N) then - - -- Reformat node as a type conversion + -- If the prefix is a type name, then reformat the node as a type + -- conversion, but not if it is the current instance of type name, + -- e.g. the expression of a type aspect, when it is analyzed within + -- a generic unit. + if Is_Type (U_N) + and then not (Inside_A_Generic and then Is_Current_Instance (P)) + then E := Remove_Head (Exprs); if Present (First (Exprs)) then diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb index d038a2d62ce..533b62aef32 100644 --- a/gcc/ada/sem_ch8.adb +++ b/gcc/ada/sem_ch8.adb @@ -8498,11 +8498,14 @@ package body Sem_Ch8 is -- It is not an error if the prefix is the current instance of -- type name, e.g. the expression of a type aspect, when it is - -- analyzed within a generic unit. We still have to verify that a - -- component of that name exists, and decorate the node + -- analyzed within a generic unit. We still have to verify that + -- a component of that name exists, and decorate the node -- accordingly. - elsif Is_Entity_Name (P) and then Is_Current_Instance (P) then + elsif Inside_A_Generic + and then Is_Entity_Name (P) + and then Is_Current_Instance (P) + then declare Comp : Entity_Id;