[Ada] Fix missing Constraint_Error for Enum_Val attribute
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 22 Jul 2019 13:57:04 +0000 (13:57 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 22 Jul 2019 13:57:04 +0000 (13:57 +0000)
This fixes an old issue involving the Enum_Val attribute: it does not
always raise a Constraint_Error exception when the specified value is
not valid for the enumeration type (instead a modulo computation is
applied to the value).

2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* exp_attr.adb (Expand_N_Attribute_Reference)
<Attribute_Enum_Val>: Set No_Truncation on the
N_Unchecked_Type_Conversion built around the argument passed to
the attribute.

gcc/testsuite/

* gnat.dg/enum_val1.adb: New testcase.

From-SVN: r273676

gcc/ada/ChangeLog
gcc/ada/exp_attr.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/enum_val1.adb [new file with mode: 0644]

index 276fdba..85a0a26 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_attr.adb (Expand_N_Attribute_Reference)
+       <Attribute_Enum_Val>: Set No_Truncation on the
+       N_Unchecked_Type_Conversion built around the argument passed to
+       the attribute.
+
 2019-07-22  Nicolas Roche  <roche@adacore.com>
 
        * libgnat/s-valrea.adb (Scan_Real): Ignore non significative
index 90ca8ff..2748c51 100644 (file)
@@ -3282,6 +3282,13 @@ package body Exp_Attr is
 
          Expr := Unchecked_Convert_To (Ptyp, First (Exprs));
 
+         --  Ensure that the expression is not truncated since the "bad" bits
+         --  are desired.
+
+         if Nkind (Expr) = N_Unchecked_Type_Conversion then
+            Set_No_Truncation (Expr);
+         end if;
+
          Insert_Action (N,
            Make_Raise_Constraint_Error (Loc,
              Condition =>
index d49f018..da0bf2a 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/enum_val1.adb: New testcase.
+
 2019-07-22  Nicolas Roche  <roche@adacore.com>
 
        * gnat.dg/float_value1.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/enum_val1.adb b/gcc/testsuite/gnat.dg/enum_val1.adb
new file mode 100644 (file)
index 0000000..4550c11
--- /dev/null
@@ -0,0 +1,22 @@
+with Ada.Text_IO; use Ada.Text_IO;
+
+procedure Enum_Val1 is
+   type Enum is (Two, Four);
+   for Enum use (2, 4);
+
+   Count : Natural := 0;
+
+begin
+   for I in 10 .. 11 loop
+      begin
+         Put (Integer'Image (I) & ": ");
+         Put_Line (Enum'Image (Enum'Enum_Val (I)));
+      exception
+         when Constraint_Error =>
+            Count := Count + 1;
+      end;
+   end loop;
+   if Count /= 2 then
+      raise Program_Error;
+   end if;
+end;