From f2df0100b287653c12f807c2e9d6a64d0982428f Mon Sep 17 00:00:00 2001 From: Ed Schonberg Date: Tue, 22 May 2018 13:20:26 +0000 Subject: [PATCH] [Ada] Spurious size error on fixed point type with aspect Small 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 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 | 6 ++++++ gcc/ada/freeze.adb | 10 ++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/fixedpnt3.adb | 16 ++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/fixedpnt3.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6b3e907f5d8..aae611c2df4 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,9 @@ +2018-05-22 Ed Schonberg + + * 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 * libgnat/s-dwalin.adb (Enable_Cache): Skip symbols outside of the diff --git a/gcc/ada/freeze.adb b/gcc/ada/freeze.adb index 44067e1b3e0..da77818694c 100644 --- a/gcc/ada/freeze.adb +++ b/gcc/ada/freeze.adb @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ca61568f5c5..642200308cb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-05-22 Ed Schonberg + + * gnat.dg/fixedpnt3.adb: New testcase. + 2018-05-22 Justin Squirek * 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 index 00000000000..0c2b14a401d --- /dev/null +++ b/gcc/testsuite/gnat.dg/fixedpnt3.adb @@ -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; -- 2.30.2