Merge commit 'e9634b6c6cd4815a81523975b2b109960be1a8a0' into dev-release
diff --git a/src/test/java/com/android/tools/r8/debuginfo/OverloadWithNoLineNumberTest.java b/src/test/java/com/android/tools/r8/debuginfo/OverloadWithNoLineNumberTest.java
new file mode 100644
index 0000000..47f6e4b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debuginfo/OverloadWithNoLineNumberTest.java
@@ -0,0 +1,102 @@
+// 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.ToolHelper.DexVm.Version;
+import com.android.tools.r8.debuginfo.testclasses.SimpleCallChainClassWithOverloads;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class OverloadWithNoLineNumberTest extends TestBase {
+
+  private final String SOURCE_FILE_NAME = "SimpleCallChainClassWithOverloads.java";
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClassFileData(
+            transformer(SimpleCallChainClassWithOverloads.class)
+                .removeLineNumberTable(MethodPredicate.onName("test"))
+                .transform())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(SimpleCallChainClassWithOverloads.class)
+        .addKeepClassAndMembersRules(SimpleCallChainClassWithOverloads.class)
+        .addKeepAttributeLineNumberTable()
+        .run(parameters.getRuntime(), SimpleCallChainClassWithOverloads.class)
+        .assertFailureWithErrorThatThrows(RuntimeException.class)
+        .inspectStackTrace(
+            (stackTrace, inspector) -> {
+              StackTraceLine mainLine =
+                  StackTraceLine.builder()
+                      .setClassName(typeName(SimpleCallChainClassWithOverloads.class))
+                      .setMethodName("main")
+                      .setFileName(SOURCE_FILE_NAME)
+                      .setLineNumber(10)
+                      .build();
+              if (parameters.isCfRuntime()
+                  || parameters.getDexRuntimeVersion().isOlderThan(Version.V8_1_0)) {
+                StackTraceLine testStackTraceLine =
+                    StackTraceLine.builder()
+                        .setClassName(typeName(SimpleCallChainClassWithOverloads.class))
+                        .setMethodName("test")
+                        .setFileName(SOURCE_FILE_NAME)
+                        .build();
+                assertThat(
+                    stackTrace,
+                    isSame(
+                        StackTrace.builder()
+                            // TODO(b/251677184): Stack trace lines should still be distinguishable
+                            //  even if there are no original line numbers to map back two.
+                            .add(testStackTraceLine)
+                            .add(testStackTraceLine)
+                            .add(mainLine)
+                            .build()));
+              } else {
+                assertThat(
+                    stackTrace,
+                    isSame(
+                        StackTrace.builder()
+                            // TODO(b/251677184): Strange that we are able to distinguish when using
+                            //  pc mapping.
+                            .add(
+                                StackTraceLine.builder()
+                                    .setClassName(typeName(SimpleCallChainClassWithOverloads.class))
+                                    .setMethodName("test")
+                                    .setFileName(SOURCE_FILE_NAME)
+                                    .setLineNumber(11)
+                                    .build())
+                            .add(
+                                StackTraceLine.builder()
+                                    .setClassName(typeName(SimpleCallChainClassWithOverloads.class))
+                                    .setMethodName("test")
+                                    .setFileName(SOURCE_FILE_NAME)
+                                    .setLineNumber(4)
+                                    .build())
+                            .add(mainLine)
+                            .build()));
+              }
+            });
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/testclasses/SimpleCallChainClassWithOverloads.java b/src/test/java/com/android/tools/r8/debuginfo/testclasses/SimpleCallChainClassWithOverloads.java
new file mode 100644
index 0000000..e70ba73
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debuginfo/testclasses/SimpleCallChainClassWithOverloads.java
@@ -0,0 +1,22 @@
+// 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.testclasses;
+
+public class SimpleCallChainClassWithOverloads {
+
+  public static void main(String[] args) {
+    test();
+  }
+
+  public static void test() {
+    test(System.currentTimeMillis());
+  }
+
+  public static void test(long value) {
+    if (value > 0) {
+      throw new RuntimeException("Hello World!");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
index d3e2677..9fd2a2e 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteDelegatedPropertyTest.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.kotlin.metadata;
 
 import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_4_20;
+import static com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion.KOTLINC_1_7_0;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -129,11 +130,19 @@
             .setOutputPath(temp.newFolder().toPath())
             .compileRaw();
     Assert.assertEquals(1, compileResult.exitCode);
-    assertThat(
-        compileResult.stderr,
-        containsString(
-            "unsupported [reference to the synthetic extension property for a Java get/set"
-                + " method]"));
+    if (kotlinParameters.isNewerThan(KOTLINC_1_7_0)) {
+      assertThat(
+          compileResult.stderr,
+          containsString(
+              "the feature \"references to synthetic java properties\" is only available since"
+                  + " language version 1.9"));
+    } else {
+      assertThat(
+          compileResult.stderr,
+          containsString(
+              "unsupported [reference to the synthetic extension property for a Java get/set"
+                  + " method]"));
+    }
   }
 
   private void inspectMetadata(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
index db76685..9d9d7a4 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
@@ -180,10 +180,9 @@
     comparePartitionedStackTraces(originalPartitions, firstRoundPartitions);
 
     Pair<Path, Path> d8OfR8ofR8 = compileWithD8(r8OfR8.getFirst(), r8OfR8.getSecond());
-    List<String> retracedSecondLevelStackTraces =
-        retrace(d8OfR8ofR8.getSecond(), generateStackTraces(d8OfR8ofR8.getFirst()));
-    Map<String, List<String>> secondRoundPartitions =
-        partitionStacktraces(retracedSecondLevelStackTraces);
+    List<String> d8StackTraces = generateStackTraces(d8OfR8ofR8.getFirst());
+    List<String> secondRoundStackTraces = retrace(d8OfR8ofR8.getSecond(), d8StackTraces);
+    Map<String, List<String>> secondRoundPartitions = partitionStacktraces(secondRoundStackTraces);
     comparePartitionedStackTraces(originalPartitions, secondRoundPartitions);
   }
 
diff --git a/tools/download_kotlin_dev.py b/tools/download_kotlin_dev.py
index 5d2696a..3bcf9b7 100755
--- a/tools/download_kotlin_dev.py
+++ b/tools/download_kotlin_dev.py
@@ -72,6 +72,9 @@
   download_and_save(
       JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-reflect/{0}/kotlin-reflect-{0}.jar"
       .format(top_most_version_and_build), kotlinc_lib, "kotlin-reflect.jar")
+  download_and_save(
+    JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-script-runtime/{0}/kotlin-script-runtime-{0}.jar"
+    .format(top_most_version_and_build), kotlinc_lib, "kotlin-script-runtime.jar")
 
 
 def download_and_save(url, path, name):