Commit cc64d9eb authored by FPK's avatar FPK
Browse files

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

    conditional expressions are involved, resolves #38129

git-svn-id: trunk@49095 -
parent c8c6e647
......@@ -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
......@@ -718,10 +718,13 @@ else if left.resultdef.typ=classrefdef then
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
......
{ %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.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment