diff --git a/.gitattributes b/.gitattributes index b95f43f877..86d8af3628 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16399,6 +16399,7 @@ tests/webtbs/tw3356.pp svneol=native#text/plain tests/webtbs/tw33563.pp svneol=native#text/pascal tests/webtbs/tw33564.pp svneol=native#text/pascal tests/webtbs/tw3360.pp svneol=native#text/plain +tests/webtbs/tw33607.pp svneol=native#text/plain tests/webtbs/tw33635.pp svneol=native#text/pascal tests/webtbs/tw3364.pp svneol=native#text/plain tests/webtbs/tw3366.pp svneol=native#text/plain diff --git a/compiler/aarch64/hlcgcpu.pas b/compiler/aarch64/hlcgcpu.pas index d7a61331be..4fe1e342be 100644 --- a/compiler/aarch64/hlcgcpu.pas +++ b/compiler/aarch64/hlcgcpu.pas @@ -64,7 +64,10 @@ implementation begin tocgsize:=def_cgsize(tosize); if (sreg.startbit<>0) or - not(sreg.bitlen in [32,64]) then + not((sreg.subsetregsize in [OS_32,OS_S32]) and + (sreg.bitlen=32)) or + not((sreg.subsetregsize in [OS_64,OS_S64]) and + (sreg.bitlen=64)) then begin if is_signed(subsetsize) then op:=A_SBFX diff --git a/tests/webtbs/tw33607.pp b/tests/webtbs/tw33607.pp new file mode 100644 index 0000000000..7e9d6ac9ff --- /dev/null +++ b/tests/webtbs/tw33607.pp @@ -0,0 +1,51 @@ +{$mode objfpc}{$H+} +{$modeSwitch advancedRecords} + +type + TRectangle = record + public + Left, Bottom: Integer; + Width, Height: Cardinal; + + function ScaleAround0(const Factor: Single): TRectangle; + end; + +function TRectangle.ScaleAround0(const Factor: Single): TRectangle; +begin + if Width <= 0 then + begin + Result.Width := Width; + Result.Left := Left; + end else + halt(3); + + Result.Height := Height; + Result.Bottom := Bottom; +end; + +function Rectangle(const Left, Bottom: Integer; + const Width, Height: Cardinal): TRectangle; +begin + Rectangle.Left := Left; + Rectangle.Bottom := Bottom; + Rectangle.Width := Width; + Rectangle.Height := Height; +end; + +procedure test(c: qword); +begin + if c<>0 then + halt(2); +end; + +var + R, S : TRectangle; +begin + R := Rectangle(10, 20, 0, 50); + S := R.ScaleAround0(2); + if s.width<>0 then + halt(1); + + test(R.ScaleAround0(2).Width); +end. +