* do not swap left/right code generation for assignment nodes if

conditional expressions are involved, resolves #38129
(cherry picked from commit cc64d9eb4e)

# Conflicts:
#	.gitattributes
This commit is contained in:
florian 2021-03-31 20:53:18 +00:00
parent 3dae87fdb3
commit 1127761f49
2 changed files with 26 additions and 2 deletions

View File

@ -719,10 +719,13 @@ implementation
empty value is assigned
But not when the result is in the flags, then
loading the left node afterwards can destroy the flags.
loading the left node afterwards can destroy the flags.
Neither if right contains conditional nodes: this might cause problems with
temp. nodes with init code used by CSE, see e.g. #38129
}
if not(right.expectloc in [LOC_FLAGS,LOC_JUMP]) and
(node_complexity(right)>node_complexity(left)) then
(node_complexity(right)>node_complexity(left)) and not(has_conditional_nodes(right)) then
begin
secondpass(right);
if codegenerror then

21
tests/webtbs/tw38129.pp Normal file
View File

@ -0,0 +1,21 @@
{ %opt=-O3 }
{$mode objfpc}
{$H+}
function Bar(const progress: single; divs: uint32): string;
const
BarSym: array[boolean] of char = ('.', '#');
var
i: int32;
begin
SetLength(result, divs);
for i := 0 to int32(divs) - 1 do
pChar(result)[i] := BarSym[(progress >= (0.75 + i) / divs) or (i = int32(divs) - 1) and (progress >= 1)];
end;
var
s: string;
begin
if Bar(0.7, 10)<>'#######...' then
halt(1);
end.