diff --git a/src/java.base/share/classes/jdk/internal/foreign/layout/SequenceLayoutImpl.java b/src/java.base/share/classes/jdk/internal/foreign/layout/SequenceLayoutImpl.java index bcbf76ea338..16cffdad253 100644 --- a/src/java.base/share/classes/jdk/internal/foreign/layout/SequenceLayoutImpl.java +++ b/src/java.base/share/classes/jdk/internal/foreign/layout/SequenceLayoutImpl.java @@ -179,7 +179,7 @@ public final class SequenceLayoutImpl extends AbstractLayout @Override public String toString() { - boolean max = (Long.MAX_VALUE / elementLayout.byteSize()) == elemCount; + boolean max = (Long.MAX_VALUE / Math.max(1, elementLayout.byteSize())) == elemCount; return decorateLayoutString(String.format("[%s:%s]", max ? "*" : elemCount, elementLayout)); } diff --git a/test/jdk/java/foreign/TestLayouts.java b/test/jdk/java/foreign/TestLayouts.java index ee758cf884d..f7e0a8b7468 100644 --- a/test/jdk/java/foreign/TestLayouts.java +++ b/test/jdk/java/foreign/TestLayouts.java @@ -216,6 +216,21 @@ public class TestLayouts { () -> MemoryLayout.sequenceLayout(0, JAVA_LONG).withElementCount(Long.MAX_VALUE)); } + @Test + public void testSequenceLayoutWithZeroLength() { + SequenceLayout layout = MemoryLayout.sequenceLayout(0, JAVA_INT); + assertEquals(layout.toString(), "[0:i4]"); + + SequenceLayout nested = MemoryLayout.sequenceLayout(0, layout); + assertEquals(nested.toString(), "[0:[0:i4]]"); + + SequenceLayout layout2 = MemoryLayout.sequenceLayout(0, JAVA_INT); + assertEquals(layout, layout2); + + SequenceLayout nested2 = MemoryLayout.sequenceLayout(0, layout2); + assertEquals(nested, nested2); + } + @Test public void testStructOverflow() { assertThrows(IllegalArgumentException.class, // negative