Skip to content

Commit ec8c015

Browse files
committed
Promote sub-32-bit integers in for-loop inline var inference
for var i := 0 to N inferred i as byte/char instead of LongInt. Apply the same promotion logic that inline_var_statement uses for regular var i := expr declarations.
1 parent 0110bc5 commit ec8c015

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

compiler/pstatmnt.pas

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,13 @@ ((tsubscriptnode(hp).left.resultdef.typ=recorddef) or
785785
{ Infer the loop variable type from the 'from' expression. }
786786
if assigned(hfrom.resultdef) and (hfrom.resultdef <> generrordef) then
787787
begin
788-
loopvs.vardef := hfrom.resultdef;
788+
{ Promote sub-32-bit integers to LongInt, same as
789+
inline_var_statement does for var i := expr. }
790+
if not(nf_explicit in hfrom.flags) and is_integer(hfrom.resultdef) and
791+
(torddef(hfrom.resultdef).ordtype in [s8bit,u8bit,s16bit,u16bit]) then
792+
loopvs.vardef := s32inttype
793+
else
794+
loopvs.vardef := hfrom.resultdef;
789795
if loopvs.typ = staticvarsym then
790796
cnodeutils.insertbssdata(tstaticvarsym(loopvs));
791797
end

0 commit comments

Comments
 (0)