[Ada] Fix crash on dynamic predicate when generating SCOs
authorThomas Quinot <quinot@adacore.com>
Thu, 11 Jul 2019 08:01:44 +0000 (08:01 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 11 Jul 2019 08:01:44 +0000 (08:01 +0000)
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

gcc/ada/ChangeLog
gcc/ada/sem_prag.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/scos1.adb [new file with mode: 0644]

index 93a6fdc5db516926caac2992f86e98cc3f34dc1d..79ee0b11ed4e8efc5ed08f46374cc734a78b586c 100644 (file)
@@ -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
index 969820ee6f28cd6679bfc2eeb998a2870f9c4c49..1a2a759017c4739f87ba984b543548a228d6cdd9 100644 (file)
@@ -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;
 
index 3b393fb60cdfc2a9d5b642fc280a64a61753b1ae..66d1e3ed5bec8e722ee2bd7ba279cacf1bebca4d 100644 (file)
@@ -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 (file)
index 0000000..778c071
--- /dev/null
@@ -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;