https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111675
Bug ID: 111675 Summary: Incorrect parameter value passed when attempting to pass a field of a packed record as a parameter Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: modula2 Assignee: gaius at gcc dot gnu.org Reporter: gaius at gcc dot gnu.org Target Milestone: --- Summary cannot pass a packed field by value to a procedure as it results in a garbled value. Consider the example below, if compiled and run we get: $ gm2 -g packedrecord3.mod $ ./a.out failed to pass 0 into test $ gdb ./a.out (gdb) break printf (gdb) run Breakpoint 3, __printf (format=0x402008 "failed to pass %d into test\n") (gdb) where #0 __printf (format=0x402008 "failed to pass %d into test\n") at printf.c:28 #1 0x0000000000401387 in test (s=36893488147419103232, level=0) at packedrecord3.mod:25 #2 0x00000000004012ce in _M2_packedrecord3_init (argc=1, argv=0x7fffffffe448, envp=0x7fffffffe458) at packedrecord3.mod:47 oddly print sizeof s gives 16 ! module packedrecord3 ; (*!m2iso+gm2*) from libc import printf, exit ; type subrange = [0..63] ; packedrec = record <* bytealignment (0) *> bool: boolean ; col : (white, black) ; sub : subrange ; end ; var global: subrange ; pr : packedrec ; procedure test (s: subrange; level: cardinal) ; begin if s # global then printf ("failed to pass %d into test\n", ord (s)) ; exit (1) end ; if level > 0 then test (s, level-1) end end test ; begin if size (pr) # 1 then printf ("test failed as size (pr) should be 1 not %d\n", size (pr)) ; exit (1) end ; for global := min (subrange) to max (subrange) do test (global, 2) end ; for global := min (subrange) to max (subrange) do pr.bool := false ; pr.sub := global ; test (pr.sub, 2) end end packedrecord3.