diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2021-03-01 16:23:38 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-06-17 10:32:09 -0400 |
commit | 9e1ca4e3ab0fb7156fed4480c8f35810d00ff84d (patch) | |
tree | a2fb8793cfe7859293527715c39b80adb66155c1 /gcc/ada/checks.adb | |
parent | f54fb769ec25976858e6bdea9c6a1beeb70f91fa (diff) | |
download | gcc-9e1ca4e3ab0fb7156fed4480c8f35810d00ff84d.zip gcc-9e1ca4e3ab0fb7156fed4480c8f35810d00ff84d.tar.gz gcc-9e1ca4e3ab0fb7156fed4480c8f35810d00ff84d.tar.bz2 |
[Ada] Apply aliasing checks only to names and not to objects as actuals
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).
Diffstat (limited to 'gcc/ada/checks.adb')
-rw-r--r-- | gcc/ada/checks.adb | 21 |
1 files changed, 4 insertions, 17 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 877a982..d8cdb64 100644 --- 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 |