diff options
author | Thomas Quinot <quinot@adacore.com> | 2019-07-11 08:01:44 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-11 08:01:44 +0000 |
commit | e2a2d49440c8f8253d15054b6147810a88a10242 (patch) | |
tree | 42b0e182aeae952f228472f9de296a94ee768acf | |
parent | a3d1ca0127cf4ca6bb8d0da5a525d17dfc58cbc9 (diff) | |
download | gcc-e2a2d49440c8f8253d15054b6147810a88a10242.zip gcc-e2a2d49440c8f8253d15054b6147810a88a10242.tar.gz gcc-e2a2d49440c8f8253d15054b6147810a88a10242.tar.bz2 |
[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
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/sem_prag.adb | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/scos1.adb | 26 |
4 files changed, 42 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 93a6fdc..79ee0b1 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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 diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 969820e..1a2a759 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3b393fb..66d1e3e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/gnat.dg/scos1.adb b/gcc/testsuite/gnat.dg/scos1.adb new file mode 100644 index 0000000..778c071 --- /dev/null +++ b/gcc/testsuite/gnat.dg/scos1.adb @@ -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; |