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

conditional expressions are involved, resolves #38129

git-svn-id: trunk@49095 -
This commit is contained in:
florian 2021-03-31 20:53:18 +00:00
parent c8c6e647be
commit cc64d9eb4e
3 changed files with 27 additions and 2 deletions

1
.gitattributes vendored
View File

@ -18720,6 +18720,7 @@ tests/webtbs/tw38074.pp svneol=native#text/pascal
tests/webtbs/tw38083.pp svneol=native#text/pascal
tests/webtbs/tw38122.pp svneol=native#text/pascal
tests/webtbs/tw38122b.pp svneol=native#text/pascal
tests/webtbs/tw38129.pp svneol=native#text/pascal
tests/webtbs/tw3814.pp svneol=native#text/plain
tests/webtbs/tw38145a.pp svneol=native#text/pascal
tests/webtbs/tw38145b.pp svneol=native#text/pascal

View File

@ -719,9 +719,12 @@ implementation
But not when the result is in the flags, then
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.