Commit e2a2d494 by Thomas Quinot Committed by Pierre-Marie de Rodat

[Ada] Fix crash on dynamic predicate when generating SCOs

A pragma Check for Dynamic_Predicate does not correspond to any source
construct that has a provisionally-disabled SCO.

2019-07-11  Thomas Quinot  <quinot@adacore.com>

gcc/ada/

	* sem_prag.adb (Analyze_Pragma, case pragma Check): Do not call
	Set_SCO_Pragma_Enabled for the dynamic predicate case.

gcc/testsuite/

	* gnat.dg/scos1.adb: New testcase.

From-SVN: r273384
parent a3d1ca01
2019-07-11 Thomas Quinot <quinot@adacore.com>
* sem_prag.adb (Analyze_Pragma, case pragma Check): Do not call
Set_SCO_Pragma_Enabled for the dynamic predicate case.
2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> 2019-07-11 Hristian Kirtchev <kirtchev@adacore.com>
* exp_util.ads, exp_util.adb (Needs_Finalization): Move to * exp_util.ads, exp_util.adb (Needs_Finalization): Move to
......
...@@ -14113,9 +14113,14 @@ package body Sem_Prag is ...@@ -14113,9 +14113,14 @@ package body Sem_Prag is
Expr := Get_Pragma_Arg (Arg2); Expr := Get_Pragma_Arg (Arg2);
-- Deal with SCO generation -- Mark the pragma (or, if rewritten from an aspect, the original
-- aspect) as enabled. Nothing to do for an internally generated
-- check for a dynamic predicate.
if Is_Checked (N) and then not Split_PPC (N) then if Is_Checked (N)
and then not Split_PPC (N)
and then Cname /= Name_Dynamic_Predicate
then
Set_SCO_Pragma_Enabled (Loc); Set_SCO_Pragma_Enabled (Loc);
end if; end if;
2019-07-11 Thomas Quinot <quinot@adacore.com>
* gnat.dg/scos1.adb: New testcase.
2019-07-11 Justin Squirek <squirek@adacore.com> 2019-07-11 Justin Squirek <squirek@adacore.com>
* gnat.dg/access7.adb: New testcase. * gnat.dg/access7.adb: New testcase.
......
-- { dg-do compile }
-- { dg-options "-gnata -gnateS" }
procedure SCOs1 with SPARK_Mode => On is
LEN_IN_BITS : constant := 20;
M_SIZE_BYTES : constant := 2 ** LEN_IN_BITS;
ET_BYTES : constant := (M_SIZE_BYTES - 4);
type T_BYTES is new Integer range 0 .. ET_BYTES with Size => 32;
subtype TYPE5_SCALAR is T_BYTES
with Dynamic_Predicate => TYPE5_SCALAR mod 4 = 0;
type E_16_BYTES is new Integer;
subtype RD_BYTES is E_16_BYTES
with Dynamic_Predicate => RD_BYTES mod 4 = 0;
function "-" (left : TYPE5_SCALAR; right : RD_BYTES) return TYPE5_SCALAR
is ( left - TYPE5_SCALAR(right) )
with Pre => TYPE5_SCALAR(right) <= left and then
left - TYPE5_SCALAR(right) <= T_BYTES'Last, Inline_Always;
begin
null;
end SCOs1;
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