Commit f062a975 by Piotr Trojanek Committed by Pierre-Marie de Rodat

[Ada] Fix handling of Pre/Post contracts with AND THEN expressions

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
parent acc257bb
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.
......
......@@ -16453,7 +16453,9 @@ package body Sem_Util is
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
......
-- { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment