Add repro of duplicate mapping for methods with unused argument
Bug: 140851070
Change-Id: I5d2b72ffa946cc3de1e3ee82ee66b5dac29b95cb
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionMappingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionMappingTest.java
new file mode 100644
index 0000000..5e7a17d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionMappingTest.java
@@ -0,0 +1,101 @@
+// Copyright (c) 2020, 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.ir.optimize.unusedarguments;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class UnusedArgumentsCollisionMappingTest extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ public UnusedArgumentsCollisionMappingTest(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ R8TestRunResult runResult =
+ testForR8(parameters.getBackend())
+ .addProgramClasses(Main.class)
+ .setMinApi(parameters.getApiLevel())
+ .addKeepMainRule(Main.class)
+ .enableInliningAnnotations()
+ .addKeepAttributeLineNumberTable()
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("test with unused", "test with used: foo")
+ .inspect(this::verifyArgumentsRemoved);
+ // TODO(b/140851070): Duplicate entries for different methods.
+ assertEquals(
+ 2,
+ StringUtils.splitLines(runResult.proguardMap()).stream()
+ .filter(line -> line.contains("void test(java.lang.String,java.lang.String)"))
+ .count());
+ assertEquals(
+ 0,
+ StringUtils.splitLines(runResult.proguardMap()).stream()
+ .filter(line -> line.contains("void test(java.lang.String)"))
+ .count());
+ }
+
+ private void verifyArgumentsRemoved(CodeInspector inspector) {
+ ClassSubject main = inspector.clazz(Main.class);
+ assertThat(main, isPresent());
+ List<FoundMethodSubject> foundMethodSubjects = main.allMethods();
+ assertEquals(3, foundMethodSubjects.size());
+ boolean foundZeroArgumentMethod = false;
+ boolean foundOneArgumentMethod = false;
+ for (FoundMethodSubject method : foundMethodSubjects) {
+ if (method.getFinalName().equals("main")) {
+ continue;
+ }
+ foundZeroArgumentMethod |= method.getMethod().parameters().size() == 0;
+ foundOneArgumentMethod |= method.getMethod().parameters().size() == 1;
+ }
+ assertTrue(foundZeroArgumentMethod);
+ assertTrue(foundOneArgumentMethod);
+ }
+
+ public static class Main {
+
+ @NeverInline
+ public static void test(String unused) {
+ System.out.println("test with unused");
+ }
+
+ @NeverInline
+ public static void test(String used, String unused) {
+ System.out.println("test with used: " + used);
+ }
+
+ public static void main(String[] args) {
+ test("foo");
+ test("foo", "notused");
+ }
+ }
+}