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: unassig...@gcc.gnu.org ReportedBy: eu...@debian.org 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.