--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: gnat: Fail to reconize types with an unrejected static size attribute as compile time known size type.
- From: Henri GEIST <geist.henri@laposte.net>
- Date: Mon, 25 Jan 2016 12:01:15 +0100
- Message-id: <20160125110115.11551.63480.reportbug@server.self-motion.com>
Package: gnat
Version: 4.9
Severity: normal
Tags: upstream
Dear Maintainer,
As said in the bug title gnat fail to reconize some compile time known size
type as it in some circumstances.
Please see below a minimal test case striped down form a real case :
procedure Foo is
type Unbiased_T is range 0 .. 4
with Size => 3;
pragma Warnings
(Off, "size clause forces biased representation for ""Biased_T""");
type Biased_T is range 1 .. 4
with Size => 2;
pragma Warnings
(On, "size clause forces biased representation for ""Biased_T""");
type Biased_Or_Unbiased_T (Biased : Boolean) is
record
case Biased is
when True => Biased_Value : Biased_T;
when False => Unbiased_Value : Unbiased_T;
end case;
end record
with Unchecked_Union,
Convention => Ada,
Size => 3;
for Biased_Or_Unbiased_T use
record
Biased_Value at 0 range 1 .. 2;
Unbiased_Value at 0 range 0 .. 2;
end record;
type Hardware_Register_T
(Value_1_Is_Biased : Boolean;
Value_2_Is_Biased : Boolean) is
record
Value_1 : Biased_Or_Unbiased_T (Value_2_Is_Biased);
Value_2 : Biased_Or_Unbiased_T (Value_2_Is_Biased);
end record
with Size => 8,
Volatile;
for Hardware_Register_T use
record
Value_1 at 0 range 0 .. 2;
Value_2 at 0 range 3 .. 5;
Value_1_Is_Biased at 0 range 6 .. 6;
Value_2_Is_Biased at 0 range 7 .. 7;
end record;
begin
null;
end Foo;
When invoking gnatmake as this :
gnatmake foo.adb
I get this output :
gcc-4.9 -c foo.adb
foo.adb:38:11: size clause not allowed for variable length type
foo.adb:42:28: component clause not allowed for variable length component
foo.adb:43:28: component clause not allowed for variable length component
gnatmake: "foo.adb" compilation error
But none of the types here are variable length.
By some little investigation I have found that all of the 3 reported errors
cames from the same place in the compiler code.
The function Size_Known_At_Compile_Time return False and should return True
in the file freeze.adb at line 2832 and line 5228.
I expected at least any type with a static unrejected size attribute or clause
to be considered having a Size_Known_At_Compile_Time.
The function Size_Known_At_Compile_Time itself defined in einfo.adb line 2892
just return a flag which seem to only be manipulated by the procedure
Set_Size_Known_At_Compile_Time also define in einfo.adb at line 5655.
I suspect a call to the procedure Set_Size_Known_At_Compile_Time should be
added somwhere in freese.adb when there is a size clause or attribute for a
type but there I am at my limit in my understanding of the compiler code.
I suspect this bug to be present in all architecture and I can at least
confirme it on gnat-4.9 for x86 and powerpc, gnat-4.6 on x86 and
avr-ada gnat-4.7.
In the hope this bug report will help.
Henri GEIST
-- System Information:
Debian Release: 8.2
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: i386 (i686)
Kernel: Linux 3.16.0-4-686-pae (SMP w/2 CPU cores)
Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
Versions of packages gnat depends on:
ii gnat-4.9 4.9.2-1
Versions of packages gnat recommends:
ii ada-reference-manual-2012 1:2012.2-3
ii gnat-gps 5.3dfsg-1
gnat suggests no packages.
-- no debconf information
--- End Message ---