aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Squirek <squirek@adacore.com>2018-07-16 14:11:04 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2018-07-16 14:11:04 +0000
commit721500abf2b9d41bea8d2c91277c4ad5ab834db7 (patch)
tree670dcec511ad6f14a5966c391f8a720d3199771e
parent3c820aca5548d850811e41f7aa85f4a7fb10d6ed (diff)
downloadgcc-721500abf2b9d41bea8d2c91277c4ad5ab834db7.zip
gcc-721500abf2b9d41bea8d2c91277c4ad5ab834db7.tar.gz
gcc-721500abf2b9d41bea8d2c91277c4ad5ab834db7.tar.bz2
[Ada] Spurious possible contraint error warning with No_Exception_Propagation
This patch corrects an issue whereby spurious unhandled exception warnings on integer literals within static if and case expressions would be emitted when the restriction No_Exception_Propagation is enabled. ------------ -- Source -- ------------ -- gnat.adc pragma Restrictions (No_Exception_Propagation); pragma SPARK_Mode (On); -- pack.ads package Pack is procedure Filter (Ret : out Integer); end Pack; -- pack.adb package body Pack is subtype Nat is Integer range 0 .. 10; Default : constant Nat := 1; User_Override : constant Integer := -1; procedure Filter (Ret : out Integer) is Val : constant Nat := (if User_Override in Nat then User_Override else Default); begin Ret := Val; end Filter; end Pack; ---------------------------- -- Compilation and output -- ---------------------------- & gcc -c -gnatp -gnatwa pack.adb 2018-07-16 Justin Squirek <squirek@adacore.com> gcc/ada/ * sem_eval.adb (Eval_Integer_Literal): Add exception for avoiding checks on expanded literals within if and case expressions. From-SVN: r262714
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/sem_eval.adb11
2 files changed, 14 insertions, 2 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index a782582..6d8572d 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-16 Justin Squirek <squirek@adacore.com>
+
+ * sem_eval.adb (Eval_Integer_Literal): Add exception for avoiding
+ checks on expanded literals within if and case expressions.
+
2018-07-16 Hristian Kirtchev <kirtchev@adacore.com>
* libgnat/s-wchwts.adb (Wide_String_To_String): Use the appropriate
diff --git a/gcc/ada/sem_eval.adb b/gcc/ada/sem_eval.adb
index a567143..ab85879 100644
--- a/gcc/ada/sem_eval.adb
+++ b/gcc/ada/sem_eval.adb
@@ -2720,16 +2720,23 @@ package body Sem_Eval is
-- Start of processing for Eval_Integer_Literal
begin
-
-- If the literal appears in a non-expression context, then it is
-- certainly appearing in a non-static context, so check it. This is
-- actually a redundant check, since Check_Non_Static_Context would
-- check it, but it seems worthwhile to optimize out the call.
- -- An exception is made for a literal in an if or case expression
+ -- Additionally, when the literal appears within an if or case
+ -- expression it must be checked as well. However, due to the literal
+ -- appearing within a conditional statement, expansion greatly changes
+ -- the nature of its context and performing some of the checks within
+ -- Check_Non_Static_Context on an expanded literal may lead to spurious
+ -- and misleading warnings.
if (Nkind_In (Parent (N), N_If_Expression, N_Case_Expression_Alternative)
or else Nkind (Parent (N)) not in N_Subexpr)
+ and then (not Nkind_In (Parent (N), N_If_Expression,
+ N_Case_Expression_Alternative)
+ or else Comes_From_Source (N))
and then not In_Any_Integer_Context
then
Check_Non_Static_Context (N);