aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJavier Miranda <miranda@adacore.com>2018-08-21 14:48:35 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-08-21 14:48:35 +0000
commit322d87a9b17660f7d04a7320505591538582892a (patch)
treef2c5a63f3c954a385252992ef259e7cb05ccc167
parent24241bd0388ec6f730788540b289da12c13a34cc (diff)
downloadgcc-322d87a9b17660f7d04a7320505591538582892a.zip
gcc-322d87a9b17660f7d04a7320505591538582892a.tar.gz
gcc-322d87a9b17660f7d04a7320505591538582892a.tar.bz2
[Ada] Crash processing SPARK annotate aspect
The compiler blows up writing the ALI file of a package that has a ghost subprogram with an annotate contract. 2018-08-21 Javier Miranda <miranda@adacore.com> gcc/ada/ * lib-writ.adb (Write_Unit_Information): Handle pragmas removed by the expander. gcc/testsuite/ * gnat.dg/spark2.adb, gnat.dg/spark2.ads: New testcase. From-SVN: r263732
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/lib-writ.adb9
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/spark2.adb12
-rw-r--r--gcc/testsuite/gnat.dg/spark2.ads16
5 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index ff886eb..1d21061 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2018-08-21 Javier Miranda <miranda@adacore.com>
+
+ * lib-writ.adb (Write_Unit_Information): Handle pragmas removed
+ by the expander.
+
2018-08-21 Ed Schonberg <schonberg@adacore.com>
* sem_ch6.adb (Check_Synchronized_Overriding): The conformance
diff --git a/gcc/ada/lib-writ.adb b/gcc/ada/lib-writ.adb
index 9a54fa9..beb9489 100644
--- a/gcc/ada/lib-writ.adb
+++ b/gcc/ada/lib-writ.adb
@@ -744,7 +744,14 @@ package body Lib.Writ is
Note_Unit := U;
end if;
- if Note_Unit = Unit_Num then
+ -- No action needed for pragmas removed by the expander (for
+ -- example, pragmas of ignored ghost entities).
+
+ if Nkind (N) = N_Null_Statement then
+ pragma Assert (Nkind (Original_Node (N)) = N_Pragma);
+ null;
+
+ elsif Note_Unit = Unit_Num then
Write_Info_Initiate ('N');
Write_Info_Char (' ');
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ddc6e0d..b4f0c41 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-08-21 Javier Miranda <miranda@adacore.com>
+
+ * gnat.dg/spark2.adb, gnat.dg/spark2.ads: New testcase.
+
2018-08-21 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/prot6.adb, gnat.dg/prot6.ads: New testcase.
diff --git a/gcc/testsuite/gnat.dg/spark2.adb b/gcc/testsuite/gnat.dg/spark2.adb
new file mode 100644
index 0000000..cb6c3b8
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/spark2.adb
@@ -0,0 +1,12 @@
+-- { dg-do compile }
+
+package body SPARK2 with SPARK_Mode is
+ function Factorial (N : Natural) return Natural is
+ begin
+ if N = 0 then
+ return 1;
+ else
+ return N * Factorial (N - 1);
+ end if;
+ end Factorial;
+end SPARK2;
diff --git a/gcc/testsuite/gnat.dg/spark2.ads b/gcc/testsuite/gnat.dg/spark2.ads
new file mode 100644
index 0000000..c60b1e2
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/spark2.ads
@@ -0,0 +1,16 @@
+package SPARK2 with SPARK_Mode is
+
+ function Expon (Value, Exp : Natural) return Natural is
+ (if Exp = 0 then 1
+ else Value * Expon (Value, Exp - 1))
+ with Ghost,
+ Pre => Value <= Max_Factorial_Number and Exp <= Max_Factorial_Number,
+ Annotate => (GNATprove, Terminating); -- CRASH!
+
+ Max_Factorial_Number : constant := 6;
+
+ function Factorial (N : Natural) return Natural with
+ Pre => N < Max_Factorial_Number,
+ Post => Factorial'Result <= Expon (Max_Factorial_Number, N);
+
+end SPARK2;