diff mbox series

[Ada] Apply aliasing checks only to names and not to objects as actuals

Message ID 20210617143310.GA8794@adacore.com
State New
Headers show
Series [Ada] Apply aliasing checks only to names and not to objects as actuals | expand

Commit Message

Pierre-Marie de Rodat June 17, 2021, 2:33 p.m. UTC
Run-time checks generated by the compiler with -gnateA switch are only
relevant for actuals that name existing objects. They are irrelevant for
other (anonymous) objects, because an object that acts as actual for one
parameter cannot be referenced as the actual for another parameter.
Consequently, there can be no storage overlap between such objects.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* checks.adb (Apply_Parameter_Aliasing_Checks): Replace calls to
	Is_Object_Reference with calls to Is_Name_Reference; remove
	asymmetric condition that only detected an aggregate as the
	first actual (aggregate objects were just a special case of an
	object reference that was not a name).
diff mbox series

Patch

diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -2507,29 +2507,16 @@  package body Checks is
       while Present (Actual_1) and then Present (Formal_1) loop
          Orig_Act_1 := Original_Actual (Actual_1);
 
-         --  Ensure that the actual is an object that is not passed by value.
-         --  Elementary types are always passed by value, therefore actuals of
-         --  such types cannot lead to aliasing. An aggregate is an object in
-         --  Ada 2012, but an actual that is an aggregate cannot overlap with
-         --  another actual.
-
-         if Nkind (Orig_Act_1) = N_Aggregate
-           or else (Nkind (Orig_Act_1) = N_Qualified_Expression
-                     and then Nkind (Expression (Orig_Act_1)) = N_Aggregate)
-         then
-            null;
-
-         elsif Is_Object_Reference (Orig_Act_1) then
+         if Is_Name_Reference (Orig_Act_1) then
             Actual_2 := Next_Actual (Actual_1);
             Formal_2 := Next_Formal (Formal_1);
             while Present (Actual_2) and then Present (Formal_2) loop
                Orig_Act_2 := Original_Actual (Actual_2);
 
-               --  The other actual we are testing against must also denote
-               --  a non pass-by-value object. Generate the check only when
-               --  the mode of the two formals may lead to aliasing.
+               --  Generate the check only when the mode of the two formals may
+               --  lead to aliasing.
 
-               if Is_Object_Reference (Orig_Act_2)
+               if Is_Name_Reference (Orig_Act_2)
                  and then May_Cause_Aliasing (Formal_1, Formal_2)
                then