[Ada] Spurious size error on fixed point type with aspect Small
authorEd Schonberg <schonberg@adacore.com>
Tue, 22 May 2018 13:20:26 +0000 (13:20 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 22 May 2018 13:20:26 +0000 (13:20 +0000)
This path fixes a spurious size error on a fixed point that carries an
aspect specification for the 'Small of the type, when there is a subsequent
derivation of that type before the type is frozen, the given 'Small is not
not a power of two, and the bounds of the type require its full size, also
given by an aspect specification.

2018-05-22  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* freeze.adb (Freeze_Fixed_Point_Type): If the first subtype has
delayed aspects, analyze them now, os that the representation of the
type (size, bounds) can be computed and validated.

gcc/testsuite/

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

From-SVN: r260511

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

index 6b3e907f5d8d3ea493400de0ec44440a9729a3cb..aae611c2df44af9f1d053302826078af1d9b8aa3 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * freeze.adb (Freeze_Fixed_Point_Type): If the first subtype has
+       delayed aspects, analyze them now, os that the representation of the
+       type (size, bounds) can be computed and validated.
+
 2018-05-22  Olivier Hainque  <hainque@adacore.com>
 
        * libgnat/s-dwalin.adb (Enable_Cache): Skip symbols outside of the
index 44067e1b3e02b6f17829a208e40c0f69f6ad2868..da77818694cced45b46dd332cd9cf211008873fa 100644 (file)
@@ -7466,6 +7466,16 @@ package body Freeze is
    --  Start of processing for Freeze_Fixed_Point_Type
 
    begin
+      --  The type, or its first subtype if we are freezing the anonymous
+      --  base, may have a delayed Small aspect. It must be analyzed now,
+      --  so that all characteristics of the type (size, bounds) can be
+      --  computed and validated in the call to Minimum_Size that follows.
+
+      if Has_Delayed_Aspects (First_Subtype (Typ)) then
+         Analyze_Aspects_At_Freeze_Point (First_Subtype (Typ));
+         Set_Has_Delayed_Aspects (First_Subtype (Typ), False);
+      end if;
+
       --  If Esize of a subtype has not previously been set, set it now
 
       if Unknown_Esize (Typ) then
index ca61568f5c5e9ad1bc2ff7a69ba190ae285a4e80..642200308cb3ab0eefafa15e0ffcf06547b5c64f 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-22  Ed Schonberg  <schonberg@adacore.com>
+
+       * gnat.dg/fixedpnt3.adb: New testcase.
+
 2018-05-22  Justin Squirek  <squirek@adacore.com>
 
        * gnat.dg/pure_function1.adb, gnat.dg/pure_function1.ads,
diff --git a/gcc/testsuite/gnat.dg/fixedpnt3.adb b/gcc/testsuite/gnat.dg/fixedpnt3.adb
new file mode 100644 (file)
index 0000000..0c2b14a
--- /dev/null
@@ -0,0 +1,16 @@
+--  { dg-do compile }
+--  { dg-options "-gnatws" }
+
+procedure Fixedpnt3 is
+  C_Unit : constant := 0.001;
+
+  type T_Fixed_Point is
+     delta C_Unit range (-2 ** 63) * C_Unit .. (2 ** 63 - 1) * C_Unit
+     with Size  => 64, Small => C_Unit;
+
+  type T_Short_Fixed_Point is
+     new T_Fixed_Point range (-2 ** 31) * C_Unit .. (2 ** 31 - 1) * C_Unit
+     with Size  => 32;
+begin
+   null;
+end Fixedpnt3;