http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50558
Bug #: 50558
Summary: Illegal program not detected (record component with no
supplied value) and invalid access to atomic variable
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: ada
AssignedTo: [email protected]
ReportedBy: [email protected]
Created attachment 25374
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25374
File that triggers the bug
The following invalid program (component 'Reserved' does not have default
value) compiles with no error (gcc 4.6.1 and 4.7.0 (snapshot) on Debian):
package Pkg is
type Byte is mod 2**8;
type Reserved_24 is mod 2**24;
type Data_Record is
record
Data : Byte;
Reserved : Reserved_24;
end record;
for Data_Record use
record
Data at 0 range 0 .. 7;
Reserved at 0 range 8 .. 31;
end record;
for Data_Record'Size use 32;
for Data_Record'Alignment use 4;
end Pkg;
package Pkg.Reg is
Data_Register : Data_Record;
pragma Atomic (Data_Register);
end Pkg.Reg;
with Pkg.Reg;
procedure Test is
begin
Pkg.Reg.Data_Register := (
Data => 255,
others => <> -- expected error: no value supplied for component
"Reserved"
);
end Test;
gnat gives expected error message if definition of Data_Register moved to Pkg.
Representation clause for Data_Record and pragma Atomic is not required to
trigger this bug, but with them strange assembler code generated at leas on
x86_64 and cortex-m3:
_ada_test:
movl $0, pkg__reg__data_register(%rip)
movb $-1, pkg__reg__data_register(%rip)
ret
_ada_test:
ldr r3, .L2
movs r2, #0
str r2, [r3, #0]
movs r2, #255
strb r2, [r3, #0]
bx lr
Note that atomic variable is accessed twice. I'm not yet sure if this bug can
be reproduced by a valid program.