aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Quinot <quinot@adacore.com>2019-07-11 08:01:44 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-11 08:01:44 +0000
commite2a2d49440c8f8253d15054b6147810a88a10242 (patch)
tree42b0e182aeae952f228472f9de296a94ee768acf
parenta3d1ca0127cf4ca6bb8d0da5a525d17dfc58cbc9 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/ada/sem_prag.adb9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/scos1.adb26
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;