From 7c61ccac71fbdc4fd6fe905f86703b48a53c8d06 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Wed, 13 Mar 2024 14:46:00 +0100 Subject: [PATCH] Fix non-terminating loop in flow layout (#3652) --- crates/typst/src/layout/flow.rs | 6 ++++++ tests/ref/bugs/3641-float-loop.png | Bin 0 -> 3904 bytes tests/typ/bugs/3641-float-loop.typ | 11 +++++++++++ 3 files changed, 17 insertions(+) create mode 100644 tests/ref/bugs/3641-float-loop.png create mode 100644 tests/typ/bugs/3641-float-loop.typ diff --git a/crates/typst/src/layout/flow.rs b/crates/typst/src/layout/flow.rs index 85f671429..8f0def179 100644 --- a/crates/typst/src/layout/flow.rs +++ b/crates/typst/src/layout/flow.rs @@ -257,9 +257,15 @@ impl<'a> FlowLayouter<'a> { let carry: Vec<_> = self.items.drain(sticky..).collect(); self.finish_region(engine, false)?; + let in_last = self.regions.in_last(); + for item in carry { self.layout_item(engine, item)?; } + + if in_last { + break; + } } } diff --git a/tests/ref/bugs/3641-float-loop.png b/tests/ref/bugs/3641-float-loop.png new file mode 100644 index 0000000000000000000000000000000000000000..092b2ff510b1ba097025b06614bdfcaba4c3ea5b GIT binary patch literal 3904 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