[Ada] Optimization loses exception in improper use of 'Value
authorEd Schonberg <schonberg@adacore.com>
Mon, 22 Jul 2019 13:57:55 +0000 (13:57 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:57:55 +0000 (13:57 +0000)
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

14 files changed:
gcc/ada/ChangeLog
gcc/ada/libgnat/s-valboo.ads
gcc/ada/libgnat/s-valcha.ads
gcc/ada/libgnat/s-valdec.ads
gcc/ada/libgnat/s-valenu.ads
gcc/ada/libgnat/s-valint.ads
gcc/ada/libgnat/s-vallld.ads
gcc/ada/libgnat/s-vallli.ads
gcc/ada/libgnat/s-valllu.ads
gcc/ada/libgnat/s-valrea.ads
gcc/ada/libgnat/s-valuns.ads
gcc/ada/libgnat/s-valwch.ads
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt80.adb [new file with mode: 0644]

index 12ea5adb30e562b9aafe4a8ba9081169e1d4cc7c..30b798c52df5b574819096a3174aae45572fcc5f 100644 (file)
@@ -1,3 +1,16 @@
+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
index bed1ae3fa883f97bcc796753f2df5099c07607f7..f900621ea364a54bb66c9567fa2bd88138deb2da 100644 (file)
@@ -30,7 +30,7 @@
 ------------------------------------------------------------------------------
 
 package System.Val_Bool is
-   pragma Pure;
+   pragma Preelaborate;
 
    function Value_Boolean (Str : String) return Boolean;
    --  Computes Boolean'Value (Str)
index 0d3edfcfdcee9452d3295fb7ba7fce3d95d9aca1..b9d537331a3d95d0c22cb9f1e091f4109b099640 100644 (file)
@@ -30,7 +30,7 @@
 ------------------------------------------------------------------------------
 
 package System.Val_Char is
-   pragma Pure;
+   pragma Preelaborate;
 
    function Value_Character (Str : String) return Character;
    --  Computes Character'Value (Str)
index 9d4733346ef76a86df1533125d54bc1452819879..ec104903e9e63593c0ca099278c898263befc880 100644 (file)
@@ -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;
index 343acf387b0d18a0b64b3180ac887234d23f37d0..e2a3a15174d3d9f846af5f352a8aface613bc567 100644 (file)
@@ -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;
index b4be1e4dc17f1bf58561e27e40c00bd4b3980d6d..d9f15ed8466abf837224b3819e523d41b7f3b409 100644 (file)
@@ -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;
index 1ff561e99b82d3497a6a46865eb42a3e46ec8620..17db0789453eda603fc266ddcc028687de917e6f 100644 (file)
@@ -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;
index 2f510ca680d8366928c20c15def9bd01674d0288..ee75bdc69f1659599ecabecbcb2ce1f290bb599f 100644 (file)
@@ -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;
index c51849205bc9bdfaafeb8c872ae3bb95937c9c6c..ddb841440335dbde71c9063183761cbaac8d04d6 100644 (file)
@@ -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;
index 49607ed15b5f18ca238ae5f568c076974c944f5f..b59f345cf4e73303fa8cecd6944320fabcd8a378 100644 (file)
@@ -30,7 +30,7 @@
 ------------------------------------------------------------------------------
 
 package System.Val_Real is
-   pragma Pure;
+   pragma Preelaborate;
 
    function Scan_Real
      (Str : String;
index 741ae6fdbfa7bda8d7abf8e6421b95e18337004b..7d261b1d5ebfb2f0ab9f52ae35489a15aff2dffd 100644 (file)
@@ -35,7 +35,7 @@
 with System.Unsigned_Types;
 
 package System.Val_Uns is
-   pragma Pure;
+   pragma Preelaborate;
 
    function Scan_Raw_Unsigned
      (Str : String;
index 5a72295c16bf08a7acde970f849d1b088cf00cf8..5179517e7b48768d1da1096c4329cbf73aa2fba0 100644 (file)
@@ -34,7 +34,7 @@
 with System.WCh_Con;
 
 package System.Val_WChar is
-   pragma Pure;
+   pragma Preelaborate;
 
    function Value_Wide_Character
      (Str : String;
index c9679c756c8bb2b35d0e4e1c99766e51c4129dda..acc60635027d682043429d25bf6e0d946c6a620e 100644 (file)
@@ -1,3 +1,7 @@
+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.
diff --git a/gcc/testsuite/gnat.dg/opt80.adb b/gcc/testsuite/gnat.dg/opt80.adb
new file mode 100644 (file)
index 0000000..39c6cef
--- /dev/null
@@ -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;