#643663 Legal program rejected (record component with no supplied value) and invalid access to atomic variable

Package:
gnat-12
Source:
gcc-12
Description:
GNU Ada compiler
Submitter:
Євгеній Мещеряков
Date:
2022-04-04 05:33:30 UTC
Severity:
normal
Tags:
#643663#5
Date:
2011-09-28 13:20:01 UTC
From:
To:
I reported this bug to the gcc bugzilla.

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.

#643663#10
Date:
2011-10-03 15:12:49 UTC
From:
To:
retitle 643663 Legal program rejected (record component with no supplied value) and invalid access to atomic variable
thanks

It seems that program in the attachment test.ada is actually legal. So
the bug is that program in good.ada (also legal) is rejected and
incorrect code is generated for access to atomic variable.