I have a cut down version of a bug I have found:-
File 1 (main.pas) =================
program main(output) ;
procedure initregcons ; external ;
var curpseudoreg : packed -32768..32767 ; external ;
begin writeln( 'main: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ) ; writeln( 'main: alignof curpseudoreg=' , alignof( curpseudoreg ) ) ; curpseudoreg := 5 ; writeln( 'main: curpseudoreg initially set to ' , curpseudoreg ) ; initregcons ; writeln( 'main: curpseudoreg=' , curpseudoreg ) ; end.
File 2 (regabs.pas) ===================
module regabs ;
var curpseudoreg : packed -32768..32767 ; external ; var curpseudoreg : packed -32768..32767 ;
procedure initregcons ; external ;
procedure initregcons ; begin writeln( 'initregcons: sizeof curpseudoreg=' , sizeof( curpseudoreg ) ) ; writeln( 'initregcons: alignof curpseudoreg=' , alignof( curpseudoreg ) ) ; writeln( 'initregcons: curpseudoreg=' , curpseudoreg ) ; curpseudoreg := 99 ; writeln( 'initregcons: curpseudoreg now set to ' , curpseudoreg ) ; end ;
end.
I compile them:-
gpc -Wall main.pas regabs.pas
and there are no warnings. By the way gpc -v gives:-
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.6/2.8.1/specs gpc version 20010924, based on gcc-2.8.1
When I run the program I get:-
main: sizeof curpseudoreg=2 main: alignof curpseudoreg=2 main: curpseudoreg initially set to 5 initregcons: sizeof curpseudoreg=4 initregcons: alignof curpseudoreg=4 initregcons: curpseudoreg=327680 initregcons: curpseudoreg now set to 99 main: curpseudoreg=0
So the quuestion is, why is the sizeof and alignog different in the two modules?
Cheers, Martin
P.S. I am testing using integer(16) for this example but I have other similar problems (different packed ranges).