aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/contracts.adb
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2020-05-11 10:34:26 -0400
committerPierre-Marie de Rodat <derodat@adacore.com>2020-07-07 05:26:55 -0400
commit58e07eaae447b73763ae390a13a613a6b70679ce (patch)
treeaead85c6db7ae2183e7a3b9e16c8681f0cc8b627 /gcc/ada/contracts.adb
parent845c49360bca4553676d5a33603d5099e7cf6d85 (diff)
downloadgcc-58e07eaae447b73763ae390a13a613a6b70679ce.zip
gcc-58e07eaae447b73763ae390a13a613a6b70679ce.tar.gz
gcc-58e07eaae447b73763ae390a13a613a6b70679ce.tar.bz2
[Ada] Checking type invariants on in params of procedures, not functions (AI12-0044)
gcc/ada/ * contracts.adb (Add_Invariant_And_Predicate_Checks): Relax the condition for doing invariant checks so that in-mode parameters of procedures are also checked (required by AI05-0289, and restricted to procedures by AI12-0044). This is done in a procedure's nested postconditions procedure. * exp_ch6.adb (Expand_Actuals): Also perform postcall invariant checks for in parameters of procedures (but not functions). Moved invariant-checking code to end of Expand_Actuals (including the nested function Is_Public_Subp).
Diffstat (limited to 'gcc/ada/contracts.adb')
-rw-r--r--gcc/ada/contracts.adb4
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb
index 337e4b6..9931334 100644
--- a/gcc/ada/contracts.adb
+++ b/gcc/ada/contracts.adb
@@ -1864,13 +1864,15 @@ package body Contracts is
Add_Invariant_Access_Checks (Result);
end if;
- -- Add invariant and predicates for all formals that qualify
+ -- Add invariant checks for all formals that qualify (see AI05-0289
+ -- and AI12-0044).
Formal := First_Formal (Subp_Id);
while Present (Formal) loop
Typ := Etype (Formal);
if Ekind (Formal) /= E_In_Parameter
+ or else Ekind (Subp_Id) = E_Procedure
or else Is_Access_Type (Typ)
then
if Invariant_Checks_OK (Typ) then