[Ada] Spurious range check with Initialize_Scalars
authorHristian Kirtchev <kirtchev@adacore.com>
Fri, 25 May 2018 09:05:15 +0000 (09:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 25 May 2018 09:05:15 +0000 (09:05 +0000)
This patch modifies the expansion of default-initialized array objects when
pragma Initialize_Scalars or Normalize_Scalars is in effect to suppress the
generation of checks on the constructed in-place aggregate. The aggregate
intentionally contains invalid values which may not necessarily fit the
constraints of a particular component type. Check suppression ensures that
no spurious checks are generated, and that the effects of the pragmas are
carried out.

------------
-- Source --
------------

--  gnat.adc

pragma Initialize_Scalars;

--  init_scalar.adb

with Ada.Text_IO; use Ada.Text_IO;

procedure Init_Scalar is
   type Fixed is delta 0.25 range -12.0 .. 1270.0;
   type Fixed_Array is array (1 .. 1) of Fixed;

begin
   begin
      declare
         Obj : Fixed;
         pragma Unreferenced (Obj);
      begin null; end;
   exception
      when others => Put_Line ("ERROR: Fixed raised exception");
   end;

   begin
      declare
         Obj : Fixed_Array;
         pragma Unreferenced (Obj);
      begin null; end;
   exception
      when others => Put_Line ("ERROR: Fixed_Array raised exception");
   end;
end Init_Scalar;

-----------------
-- Compilation --
-----------------

$ gnatmake -q init_scalar.adb
$ ./init_scalar

2018-05-25  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

* exp_ch3.adb (Default_Initialize_Object): Ensure that the analysis of
the in-place initialization aggregate created for pragmas
Initialize_Scalars or Normalize_Scalars is performed with checks
suppressed.

From-SVN: r260740

gcc/ada/ChangeLog
gcc/ada/exp_ch3.adb

index ec7bee63a65f6efaeac16f154b5b0e62f5e8416d..ba22139a02bc44c1db1fc96d1db4be9f3121cc31 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-25  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * exp_ch3.adb (Default_Initialize_Object): Ensure that the analysis of
+       the in-place initialization aggregate created for pragmas
+       Initialize_Scalars or Normalize_Scalars is performed with checks
+       suppressed.
+
 2018-05-25  Arnaud Charlet  <charlet@adacore.com>
 
        * exp_aggr.adb (Convert_To_Positional): Bump default for
index d1ed971bd1e2092c3cbbd8f684dfd785923eae31..db93b6453afecf45cb70654abb62bb4693e47117 100644 (file)
@@ -6109,7 +6109,8 @@ package body Exp_Ch3 is
                        N    => Obj_Def,
                        Size => Esize (Def_Id)));
 
-                  Analyze_And_Resolve (Expression (N), Typ);
+                  Analyze_And_Resolve
+                    (Expression (N), Typ, Suppress => All_Checks);
 
                --  Otherwise invoke the type init proc, generate:
                --    Type_Init_Proc (Obj);