From 32841e7e8480cb16d34f60feda226e4f582c3186 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 8 Dec 2022 23:21:58 +0100 Subject: [PATCH] ada: Make Apply_Discriminant_Check.Denotes_Explicit_Dereference more robust The predicate implements the rules of the language so it needs to cope with constructs rewritten by the expander, in particular explicit dereferences that the expander uses liberally for various purposes. This change makes the detection of rewritten calls more robust and adds the detection of rewritten return objects. gcc/ada/ * checks.adb (Apply_Discriminant_Check.Denotes_Explicit_Dereference): Return false for artificial dereferences generated by the expander. --- gcc/ada/checks.adb | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 5833be3..d518e67 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -1388,13 +1388,23 @@ package body Checks is function Denotes_Explicit_Dereference (Obj : Node_Id) return Boolean is begin - return - Nkind (Obj) = N_Explicit_Dereference - or else - (Is_Entity_Name (Obj) - and then Present (Renamed_Object (Entity (Obj))) - and then Nkind (Renamed_Object (Entity (Obj))) = - N_Explicit_Dereference); + if Is_Entity_Name (Obj) then + return Present (Renamed_Object (Entity (Obj))) + and then + Denotes_Explicit_Dereference (Renamed_Object (Entity (Obj))); + + -- This routine uses the rules of the language so we need to exclude + -- rewritten constructs that introduce artificial dereferences. + + elsif Nkind (Obj) = N_Explicit_Dereference then + return not Is_Captured_Function_Call (Obj) + and then not + (Nkind (Parent (Obj)) = N_Object_Renaming_Declaration + and then Is_Return_Object (Defining_Entity (Parent (Obj)))); + + else + return False; + end if; end Denotes_Explicit_Dereference; ---------------------------------------- @@ -1497,9 +1507,7 @@ package body Checks is and then not Is_Aliased_Unconstrained_Component) or else (Ada_Version >= Ada_2005 and then not Is_Constrained (T_Typ) - and then Denotes_Explicit_Dereference (Lhs) - and then Nkind (Original_Node (Lhs)) /= - N_Function_Call)) + and then Denotes_Explicit_Dereference (Lhs))) then T_Typ := Get_Actual_Subtype (Lhs); end if; -- 2.7.4