Pre- and postconditions with top-level AND THEN expressions are broken down
into checks of indivudial conjuncts for more precise error reporting. This
rewrite interfers with detection of potentially unevaluadted use of 'Old,
e.g. a contract like "Pre => Foo and then Bar" is rewritten into a two
pragmas Check, for expressions "Foo" and "Bar", but the latter remains
potentially unevaluted. This patch fixes detection of the AND THEN rewrite.
This fixes inlining in the GNATprove mode, i.e. the following testc case must
not emit a warning like:
contract1.adb:14:07: info:
no contextual analysis of "Foo" (in potentially unevaluated context)
2018-06-11 Piotr Trojanek <trojanek@adacore.com>
gcc/ada/
* sem_util.adb (Is_Potentially_Unevaluated): Fix detection of contracts
with AND THEN expressions broken down into individual conjuncts.
gcc/testsuite/
* gnat.dg/contract1.adb: New testcase.
From-SVN: r261410
+2018-06-11 Piotr Trojanek <trojanek@adacore.com>
+
+ * sem_util.adb (Is_Potentially_Unevaluated): Fix detection of contracts
+ with AND THEN expressions broken down into individual conjuncts.
+
2018-06-11 Ed Schonberg <schonberg@adacore.com>
* exp_ch7.adb (Check_Unnesting_Elaboration_Code): Add guard.
while Present (Par)
and then Nkind (Par) /= N_Pragma_Argument_Association
loop
- if Nkind (Original_Node (Par)) = N_And_Then then
+ if Is_Rewrite_Substitution (Par)
+ and then Nkind (Original_Node (Par)) = N_And_Then
+ then
return True;
end if;
+2018-06-11 Piotr Trojanek <trojanek@adacore.com>
+
+ * gnat.dg/contract1.adb: New testcase.
+
2018-06-11 Javier Miranda <miranda@adacore.com>
* gnat.dg/aggr23.adb, gnat.dg/aggr23_q.adb, gnat.dg/aggr23_tt.ads: New
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-gnatd.F -gnatwa" }
+
+with Ada.Dispatching;
+
+procedure Contract1 with SPARK_Mode is
+
+ function Foo return Boolean is
+ begin
+ Ada.Dispatching.Yield;
+ return True;
+ end Foo;
+
+ Dummy : constant Integer := 0;
+
+begin
+ if Foo and then True then
+ raise Program_Error;
+ end if;
+end Contract1;