diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java
new file mode 100644
index 0000000..950abdc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java
@@ -0,0 +1,98 @@
+// Copyright (c) 2023, 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.mappingcompose;
+
+import static junit.framework.TestCase.assertEquals;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.ProguardMappingSupplier;
+import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate;
+import com.android.tools.r8.utils.FileUtils;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+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;
+
+/** This is a regression test for b/297970886 */
+@RunWith(Parameterized.class)
+public class ComposeWithMissingDebugInfoTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withDexRuntimesAndAllApiLevels().build();
+  }
+
+  @Test
+  public void testD8WithComposition() throws Exception {
+    Path inputMap = temp.newFolder().toPath().resolve("input.map");
+    FileUtils.writeTextFile(
+        inputMap,
+        "# {'id':'com.android.tools.r8.mapping','version':'2.2'}",
+        typeName(Main.class) + " -> " + typeName(Main.class) + ":",
+        "  12:12:int foo():12:12 -> a",
+        "  112:112:int foo():112:112 -> a");
+    StringBuilder mappingComposed = new StringBuilder();
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(
+            transformer(Main.class)
+                .setPredictiveLineNumbering(MethodPredicate.onName("a"), 12)
+                .transform())
+        .release()
+        .setMinApi(parameters)
+        .apply(
+            b ->
+                b.getBuilder()
+                    .setProguardInputMapFile(inputMap)
+                    .setProguardMapConsumer((string, handler) -> mappingComposed.append(string)))
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("42");
+    Set<String> foundMethods =
+        ProguardMappingSupplier.builder()
+            .setProguardMapProducer(ProguardMapProducer.fromString(mappingComposed.toString()))
+            .setLoadAllDefinitions(true)
+            .build()
+            .createRetracer(new DiagnosticsHandler() {})
+            .retraceMethod(
+                Reference.method(
+                    Reference.classFromTypeName(typeName(Main.class)),
+                    "a",
+                    new ArrayList<>(),
+                    Reference.typeFromTypeName("int")))
+            .stream()
+            .map(method -> method.getRetracedMethod().getMethodName())
+            .collect(Collectors.toSet());
+    Set<String> expectedMethods = new HashSet<>();
+    expectedMethods.add("a");
+    // TODO(b/297970886): We should observe 'foo' and not 'a'.
+    assertEquals(expectedMethods, foundMethods);
+  }
+
+  public static class Main {
+
+    private int val;
+
+    public static void main(String[] args) {
+      System.out.println(new Main().a());
+    }
+
+    private int a() {
+      val = 42;
+      return val;
+    }
+  }
+}
