[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
This commit is contained in:
parent
a3d1ca0127
commit
e2a2d49440
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
* exp_util.ads, exp_util.adb (Needs_Finalization): Move to
|
||||
|
@ -14113,9 +14113,14 @@ package body Sem_Prag is
|
||||
|
||||
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);
|
||||
end if;
|
||||
|
||||
|
@ -1,3 +1,7 @@
|
||||
2019-07-11 Thomas Quinot <quinot@adacore.com>
|
||||
|
||||
* gnat.dg/scos1.adb: New testcase.
|
||||
|
||||
2019-07-11 Justin Squirek <squirek@adacore.com>
|
||||
|
||||
* gnat.dg/access7.adb: New testcase.
|
||||
|
26
gcc/testsuite/gnat.dg/scos1.adb
Normal file
26
gcc/testsuite/gnat.dg/scos1.adb
Normal file
@ -0,0 +1,26 @@
|
||||
-- { 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;
|
Loading…
Reference in New Issue
Block a user