diff --git a/.gitattributes b/.gitattributes index e0a62a21de..8429247a54 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12582,6 +12582,7 @@ tests/webtbs/tw20874b.pp svneol=native#text/pascal tests/webtbs/tw20889.pp svneol=native#text/pascal tests/webtbs/tw20909.pp svneol=native#text/pascal tests/webtbs/tw20940.pp svneol=native#text/pascal +tests/webtbs/tw20947.pp svneol=native#text/pascal tests/webtbs/tw20962.pp svneol=native#text/plain tests/webtbs/tw20995a.pp svneol=native#text/pascal tests/webtbs/tw20995b.pp svneol=native#text/pascal diff --git a/compiler/scanner.pas b/compiler/scanner.pas index 1bb2aa2929..55dbf89d50 100644 --- a/compiler/scanner.pas +++ b/compiler/scanner.pas @@ -174,16 +174,16 @@ interface procedure stoprecordtokens; procedure replaytoken; procedure startreplaytokens(buf:tdynamicarray; achange_endian : boolean); - { bit length sizeint is target depend } - procedure tokenwritesizeint(val : sizeint); + { bit length asizeint is target depend } + procedure tokenwritesizeint(val : asizeint); procedure tokenwritelongint(val : longint); procedure tokenwritelongword(val : longword); procedure tokenwriteword(val : word); procedure tokenwriteshortint(val : shortint); procedure tokenwriteset(var b;size : longint); procedure tokenwriteenum(var b;size : longint); - function tokenreadsizeint : sizeint; - procedure tokenwritesettings(var asettings : tsettings; var size : sizeint); + function tokenreadsizeint : asizeint; + procedure tokenwritesettings(var asettings : tsettings; var size : asizeint); { longword/longint are 32 bits on all targets } { word/smallint are 16-bits on all targest } function tokenreadlongword : longword; @@ -197,7 +197,7 @@ interface procedure tokenreadset(var b;size : longint); function tokenreadenum(size : longint) : longword; - procedure tokenreadsettings(var asettings : tsettings; expected_size : longint); + procedure tokenreadsettings(var asettings : tsettings; expected_size : asizeint); procedure readchar; procedure readstring; procedure readnumber; @@ -2184,9 +2184,9 @@ In case not, the value returned can be arbitrary. recordtokenbuf.write(b,1); end; - procedure tscannerfile.tokenwritesizeint(val : sizeint); + procedure tscannerfile.tokenwritesizeint(val : asizeint); begin - recordtokenbuf.write(val,sizeof(sizeint)); + recordtokenbuf.write(val,sizeof(asizeint)); end; procedure tscannerfile.tokenwritelongint(val : longint); @@ -2209,11 +2209,11 @@ In case not, the value returned can be arbitrary. recordtokenbuf.write(val,sizeof(longword)); end; - function tscannerfile.tokenreadsizeint : sizeint; + function tscannerfile.tokenreadsizeint : asizeint; var - val : sizeint; + val : asizeint; begin - replaytokenbuf.read(val,sizeof(sizeint)); + replaytokenbuf.read(val,sizeof(asizeint)); if tokenbuf_change_endian then val:=swapendian(val); result:=val; @@ -2306,7 +2306,7 @@ In case not, the value returned can be arbitrary. end; - procedure tscannerfile.tokenreadsettings(var asettings : tsettings; expected_size : longint); + procedure tscannerfile.tokenreadsettings(var asettings : tsettings; expected_size : asizeint); { This procedure needs to be changed whenever @@ -2374,7 +2374,7 @@ In case not, the value returned can be arbitrary. end; end; - procedure tscannerfile.tokenwritesettings(var asettings : tsettings; var size : sizeint); + procedure tscannerfile.tokenwritesettings(var asettings : tsettings; var size : asizeint); { This procedure needs to be changed whenever @@ -2450,7 +2450,8 @@ In case not, the value returned can be arbitrary. var t : ttoken; s : tspecialgenerictoken; - len,val,msgnb,copy_size : sizeint; + len,msgnb,copy_size : asizeint; + val : longint; b : byte; pmsg : pmessagestaterecord; begin @@ -2482,7 +2483,7 @@ In case not, the value returned can be arbitrary. pmsg:=current_settings.pmessage; while assigned(pmsg) do begin - if msgnb=high(sizeint) then + if msgnb=high(asizeint) then { Too many messages } internalerror(2011090401); inc(msgnb); @@ -2492,11 +2493,12 @@ In case not, the value returned can be arbitrary. pmsg:=current_settings.pmessage; while assigned(pmsg) do begin - { What about endianess here? } + { What about endianess here?} + { SB: this is handled by tokenreadlongint } val:=pmsg^.value; - tokenwritesizeint(val); + tokenwritelongint(val); val:=ord(pmsg^.state); - tokenwritesizeint(val); + tokenwritelongint(val); pmsg:=pmsg^.next; end; last_message:=current_settings.pmessage; @@ -2613,7 +2615,7 @@ In case not, the value returned can be arbitrary. procedure tscannerfile.replaytoken; var - wlen,mesgnb,copy_size : sizeint; + wlen,mesgnb,copy_size : asizeint; specialtoken : tspecialgenerictoken; i : byte; pmsg,prevmsg : pmessagestaterecord; @@ -2717,8 +2719,8 @@ In case not, the value returned can be arbitrary. end else prevmsg^.next:=pmsg; - replaytokenbuf.read(pmsg^.value,sizeof(longint)); - replaytokenbuf.read(pmsg^.state,sizeof(tmsgstate)); + pmsg^.value:=tokenreadlongint; + pmsg^.state:=tmsgstate(tokenreadlongint); pmsg^.next:=nil; prevmsg:=pmsg; end; diff --git a/tests/webtbs/tw20947.pp b/tests/webtbs/tw20947.pp new file mode 100644 index 0000000000..b2d3ac7675 --- /dev/null +++ b/tests/webtbs/tw20947.pp @@ -0,0 +1,21 @@ +{ the important part of this test is a cross compilation which a change in the + size of the bitness, e.g. from Win32 to Win64 where the unit "fgl" was + compiled with the 32-to-64-bit cross compiler and this program itself is + compiled with the native 64-bit compiler } + +program tw20947; + +uses + fgl; + +type + TTestList = specialize TFPGList; + +Var + Test : TTestList; +begin + Test := TTestList.Create; + Test.Add(2); + WriteLn(Test[0]); // This should output 2 to console + Test.Free; +end.