diff options
author | Ed Schonberg <schonberg@adacore.com> | 2019-07-22 13:57:55 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-22 13:57:55 +0000 |
commit | ca305a848c4f1cc493e61083a14b77df226ac8af (patch) | |
tree | 58bdeb17cbd35fe3c890f57c972bcd7be4210481 /gcc | |
parent | 8c029ee8cf5d14e8c0dc0a74d9a5278c3aee49e9 (diff) | |
download | gcc-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/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valboo.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valcha.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valdec.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valenu.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valint.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-vallld.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-vallli.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valllu.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valrea.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valuns.ads | 2 | ||||
-rw-r--r-- | gcc/ada/libgnat/s-valwch.ads | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt80.adb | 15 |
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; |