aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEd Schonberg <schonberg@adacore.com>2019-07-22 13:57:55 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2019-07-22 13:57:55 +0000
commitca305a848c4f1cc493e61083a14b77df226ac8af (patch)
tree58bdeb17cbd35fe3c890f57c972bcd7be4210481 /gcc
parent8c029ee8cf5d14e8c0dc0a74d9a5278c3aee49e9 (diff)
downloadgcc-ca305a848c4f1cc493e61083a14b77df226ac8af.zip
gcc-ca305a848c4f1cc493e61083a14b77df226ac8af.tar.gz
gcc-ca305a848c4f1cc493e61083a14b77df226ac8af.tar.bz2
[Ada] Optimization loses exception in improper use of 'Value
This patch prevents an improper removal of an evaluation of attribute 'Value on an illegal input that will raise Constraint_Error, when a subsequent use of this evaluation might be optimized away by the back-end. 2019-07-22 Ed Schonberg <schonberg@adacore.com> gcc/ada/ * libgnat/s-valboo.ads, libgnat/s-valcha.ads, libgnat/s-valdec.ads, libgnat/s-valenu.ads, libgnat/s-valint.ads, libgnat/s-vallld.ads, libgnat/s-vallli.ads, libgnat/s-valllu.ads, libgnat/s-valrea.ads, libgnat/s-valuns.ads, libgnat/s-valwch.ads: Change categorization of packages that implement attribute 'Value from Pure to Preelaborate, to prevent undesirable optimizations when the evaluation of the attribute raises Constraint_Error, but subsequent use of the result of this evsaluation is removed by a subsequent optimization. gcc/testsuite/ * gnat.dg/opt80.adb: New testcase. From-SVN: r273687
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog13
-rw-r--r--gcc/ada/libgnat/s-valboo.ads2
-rw-r--r--gcc/ada/libgnat/s-valcha.ads2
-rw-r--r--gcc/ada/libgnat/s-valdec.ads2
-rw-r--r--gcc/ada/libgnat/s-valenu.ads2
-rw-r--r--gcc/ada/libgnat/s-valint.ads2
-rw-r--r--gcc/ada/libgnat/s-vallld.ads2
-rw-r--r--gcc/ada/libgnat/s-vallli.ads2
-rw-r--r--gcc/ada/libgnat/s-valllu.ads2
-rw-r--r--gcc/ada/libgnat/s-valrea.ads2
-rw-r--r--gcc/ada/libgnat/s-valuns.ads2
-rw-r--r--gcc/ada/libgnat/s-valwch.ads2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/opt80.adb15
14 files changed, 43 insertions, 11 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 12ea5ad..30b798c 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,18 @@
2019-07-22 Ed Schonberg <schonberg@adacore.com>
+ * libgnat/s-valboo.ads, libgnat/s-valcha.ads,
+ libgnat/s-valdec.ads, libgnat/s-valenu.ads,
+ libgnat/s-valint.ads, libgnat/s-vallld.ads,
+ libgnat/s-vallli.ads, libgnat/s-valllu.ads,
+ libgnat/s-valrea.ads, libgnat/s-valuns.ads,
+ libgnat/s-valwch.ads: Change categorization of packages that
+ implement attribute 'Value from Pure to Preelaborate, to prevent
+ undesirable optimizations when the evaluation of the attribute
+ raises Constraint_Error, but subsequent use of the result of
+ this evsaluation is removed by a subsequent optimization.
+
+2019-07-22 Ed Schonberg <schonberg@adacore.com>
+
* sem_warn.adb (Check_References): Do not emit s warning on a
referenced entity with no explicit assignment if the type of the
entity has Preelaborable_Initialixation, such as
diff --git a/gcc/ada/libgnat/s-valboo.ads b/gcc/ada/libgnat/s-valboo.ads
index bed1ae3..f900621 100644
--- a/gcc/ada/libgnat/s-valboo.ads
+++ b/gcc/ada/libgnat/s-valboo.ads
@@ -30,7 +30,7 @@
------------------------------------------------------------------------------
package System.Val_Bool is
- pragma Pure;
+ pragma Preelaborate;
function Value_Boolean (Str : String) return Boolean;
-- Computes Boolean'Value (Str)
diff --git a/gcc/ada/libgnat/s-valcha.ads b/gcc/ada/libgnat/s-valcha.ads
index 0d3edfc..b9d5373 100644
--- a/gcc/ada/libgnat/s-valcha.ads
+++ b/gcc/ada/libgnat/s-valcha.ads
@@ -30,7 +30,7 @@
------------------------------------------------------------------------------
package System.Val_Char is
- pragma Pure;
+ pragma Preelaborate;
function Value_Character (Str : String) return Character;
-- Computes Character'Value (Str)
diff --git a/gcc/ada/libgnat/s-valdec.ads b/gcc/ada/libgnat/s-valdec.ads
index 9d47333..ec10490 100644
--- a/gcc/ada/libgnat/s-valdec.ads
+++ b/gcc/ada/libgnat/s-valdec.ads
@@ -34,7 +34,7 @@
-- Decimal_IO, and the Value attribute for such decimal types.
package System.Val_Dec is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Decimal
(Str : String;
diff --git a/gcc/ada/libgnat/s-valenu.ads b/gcc/ada/libgnat/s-valenu.ads
index 343acf3..e2a3a15 100644
--- a/gcc/ada/libgnat/s-valenu.ads
+++ b/gcc/ada/libgnat/s-valenu.ads
@@ -34,7 +34,7 @@
-- details of the format of constructed image tables.
package System.Val_Enum is
- pragma Pure;
+ pragma Preelaborate;
function Value_Enumeration_8
(Names : String;
diff --git a/gcc/ada/libgnat/s-valint.ads b/gcc/ada/libgnat/s-valint.ads
index b4be1e4..d9f15ed 100644
--- a/gcc/ada/libgnat/s-valint.ads
+++ b/gcc/ada/libgnat/s-valint.ads
@@ -33,7 +33,7 @@
-- in Text_IO.Integer_IO, and the Value attribute.
package System.Val_Int is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Integer
(Str : String;
diff --git a/gcc/ada/libgnat/s-vallld.ads b/gcc/ada/libgnat/s-vallld.ads
index 1ff561e..17db078 100644
--- a/gcc/ada/libgnat/s-vallld.ads
+++ b/gcc/ada/libgnat/s-vallld.ads
@@ -34,7 +34,7 @@
-- Decimal_IO, and the Value attribute for such decimal types.
package System.Val_LLD is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Long_Long_Decimal
(Str : String;
diff --git a/gcc/ada/libgnat/s-vallli.ads b/gcc/ada/libgnat/s-vallli.ads
index 2f510ca..ee75bdc 100644
--- a/gcc/ada/libgnat/s-vallli.ads
+++ b/gcc/ada/libgnat/s-vallli.ads
@@ -33,7 +33,7 @@
-- values for use in Text_IO.Integer_IO, and the Value attribute.
package System.Val_LLI is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Long_Long_Integer
(Str : String;
diff --git a/gcc/ada/libgnat/s-valllu.ads b/gcc/ada/libgnat/s-valllu.ads
index c518492..ddb8414 100644
--- a/gcc/ada/libgnat/s-valllu.ads
+++ b/gcc/ada/libgnat/s-valllu.ads
@@ -35,7 +35,7 @@
with System.Unsigned_Types;
package System.Val_LLU is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Raw_Long_Long_Unsigned
(Str : String;
diff --git a/gcc/ada/libgnat/s-valrea.ads b/gcc/ada/libgnat/s-valrea.ads
index 49607ed..b59f345 100644
--- a/gcc/ada/libgnat/s-valrea.ads
+++ b/gcc/ada/libgnat/s-valrea.ads
@@ -30,7 +30,7 @@
------------------------------------------------------------------------------
package System.Val_Real is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Real
(Str : String;
diff --git a/gcc/ada/libgnat/s-valuns.ads b/gcc/ada/libgnat/s-valuns.ads
index 741ae6f..7d261b1 100644
--- a/gcc/ada/libgnat/s-valuns.ads
+++ b/gcc/ada/libgnat/s-valuns.ads
@@ -35,7 +35,7 @@
with System.Unsigned_Types;
package System.Val_Uns is
- pragma Pure;
+ pragma Preelaborate;
function Scan_Raw_Unsigned
(Str : String;
diff --git a/gcc/ada/libgnat/s-valwch.ads b/gcc/ada/libgnat/s-valwch.ads
index 5a72295..5179517 100644
--- a/gcc/ada/libgnat/s-valwch.ads
+++ b/gcc/ada/libgnat/s-valwch.ads
@@ -34,7 +34,7 @@
with System.WCh_Con;
package System.Val_WChar is
- pragma Pure;
+ pragma Preelaborate;
function Value_Wide_Character
(Str : String;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c9679c7..acc6063 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2019-07-22 Ed Schonberg <schonberg@adacore.com>
+ * gnat.dg/opt80.adb: New testcase.
+
+2019-07-22 Ed Schonberg <schonberg@adacore.com>
+
* gnat.dg/warn25.adb: New testcase.
2019-07-22 Yannick Moy <moy@adacore.com>
diff --git a/gcc/testsuite/gnat.dg/opt80.adb b/gcc/testsuite/gnat.dg/opt80.adb
new file mode 100644
index 0000000..39c6cef
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt80.adb
@@ -0,0 +1,15 @@
+-- { dg-do run }
+-- { dg-options "-O2" }
+
+with Ada.Text_IO; use Ada.Text_IO;
+
+procedure Opt80 is
+ Item : Integer;
+begin
+ Item := Integer'Value ("zzz");
+ Put_Line (Boolean'Image (Item'Valid));
+ raise Program_Error;
+exception
+ when Constraint_Error =>
+ null;
+end;