From 7120f082181be2fc8cfc4f121809da71d2554503 Mon Sep 17 00:00:00 2001 From: Piotr Trojanek Date: Tue, 16 Mar 2021 18:38:53 +0100 Subject: [PATCH] [Ada] Fix asymmetries in detection of overlapping actuals gcc/ada/ * sem_warn.adb (Warn_On_Overlapping_Actuals): Examine types of both formal parameters; refactor a complex detection of by-reference types. --- gcc/ada/sem_warn.adb | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb index b7abd1b7ab1..4ec96fc3c9d 100644 --- a/gcc/ada/sem_warn.adb +++ b/gcc/ada/sem_warn.adb @@ -3669,6 +3669,9 @@ package body Sem_Warn is --------------------------------- procedure Warn_On_Overlapping_Actuals (Subp : Entity_Id; N : Node_Id) is + function Explicitly_By_Reference (Formal_Id : Entity_Id) return Boolean; + -- Returns True iff the type of Formal_Id is explicitly by-reference + function Refer_Same_Object (Act1 : Node_Id; Act2 : Node_Id) return Boolean; @@ -3680,6 +3683,24 @@ package body Sem_Warn is -- object_name is known to refer to the same object as the other name -- (RM 6.4.1(6.11/3)) + ----------------------------- + -- Explicitly_By_Reference -- + ----------------------------- + + function Explicitly_By_Reference + (Formal_Id : Entity_Id) + return Boolean + is + Typ : constant Entity_Id := Underlying_Type (Etype (Formal_Id)); + begin + if Present (Typ) then + return Is_By_Reference_Type (Typ) + or else Convention (Typ) = Convention_Ada_Pass_By_Reference; + else + return False; + end if; + end Explicitly_By_Reference; + ----------------------- -- Refer_Same_Object -- ----------------------- @@ -3792,17 +3813,13 @@ package body Sem_Warn is then null; - -- If type is explicitly not by-copy, assume that - -- aliasing is intended. + -- If type is explicitly by-reference, then it is not + -- covered by the legality rule, which only applies to + -- elementary types. Actually, the aliasing is most + -- likely intended, so don't emit a warning either. - elsif - Present (Underlying_Type (Etype (Form1))) - and then - (Is_By_Reference_Type - (Underlying_Type (Etype (Form1))) - or else - Convention (Underlying_Type (Etype (Form1))) = - Convention_Ada_Pass_By_Reference) + elsif Explicitly_By_Reference (Form1) + or else Explicitly_By_Reference (Form2) then null; @@ -3810,7 +3827,9 @@ package body Sem_Warn is -- arrays and record types if switch is set. elsif Ada_Version >= Ada_2012 - and then not Is_Elementary_Type (Etype (Form1)) + and then not (Is_Elementary_Type (Etype (Form1)) + and then + Is_Elementary_Type (Etype (Form2))) and then not Warn_On_Overlap then null; -- 2.34.1