Test all DEX VMs report zero-valued line numbers.
Bug: b/260389461
Bug: b/260675006
Change-Id: If412fc58f49ec0ea8d278169bab2ea39281b8ffd
diff --git a/src/test/java/com/android/tools/r8/debuginfo/ZeroLineEntryTest.java b/src/test/java/com/android/tools/r8/debuginfo/ZeroLineEntryTest.java
new file mode 100644
index 0000000..4b7259f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debuginfo/ZeroLineEntryTest.java
@@ -0,0 +1,70 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.debuginfo;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.smali.SmaliBuilder;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class ZeroLineEntryTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.B).build();
+ }
+
+ public ZeroLineEntryTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void test() throws Exception {
+ SmaliBuilder smali = new SmaliBuilder();
+ smali.addClass("Test");
+ smali.setSourceFile("Test.java");
+ smali.addMainMethod(
+ 0,
+ ".line 42",
+ "invoke-static {}, Ljava/lang/System;->nanoTime()J",
+ ".line 0",
+ "new-instance v0, Ljava/lang/RuntimeException;",
+ "invoke-direct {v0}, Ljava/lang/RuntimeException;-><init>()V",
+ ".line 123",
+ "throw v0");
+
+ testForRuntime(parameters)
+ .addProgramDexFileData(smali.compile())
+ .run(parameters.getRuntime(), "Test")
+ .assertFailureWithErrorThatThrows(RuntimeException.class)
+ .inspectStackTrace(this::checkStackTrace);
+ }
+
+ private void checkStackTrace(StackTrace stacktrace) {
+ assertThat(
+ stacktrace,
+ isSame(
+ StackTrace.builder()
+ .add(
+ StackTraceLine.builder()
+ .setLineNumber(0)
+ .setMethodName("main")
+ .setClassName("Test")
+ .setFileName("Test.java")
+ .build())
+ .build()));
+ }
+}