diff --git a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java
new file mode 100644
index 0000000..93f6215
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeTest.java
@@ -0,0 +1,113 @@
+// Copyright (c) 2018, 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.naming;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.StringConsumer.FileConsumer;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.jasmin.JasminBuilder;
+import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import java.io.File;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class CovariantReturnTypeTest extends TestBase {
+
+  @Ignore("b/115613850")
+  @Test
+  public void test() throws Exception {
+    for (int i = 0; i < 3; i++) {
+      JasminBuilder appBuilder = new JasminBuilder();
+      ClassBuilder classBuilder = appBuilder.addClass("package.TestClass");
+
+      classBuilder.addVirtualMethod(
+          "method1",
+          "Ljava/lang/Object;",
+          ".limit stack 1",
+          ".limit locals 1",
+          "aconst_null",
+          "areturn");
+      classBuilder.addVirtualMethod(
+          "method1", "Lpackage/A;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+      classBuilder.addVirtualMethod(
+          "method1", "Lpackage/B;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+
+      classBuilder.addVirtualMethod(
+          "method2", "Lpackage/A;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+      classBuilder.addVirtualMethod(
+          "method2",
+          "Ljava/lang/Object;",
+          ".limit stack 1",
+          ".limit locals 1",
+          "aconst_null",
+          "areturn");
+      classBuilder.addVirtualMethod(
+          "method2", "Lpackage/B;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+
+      classBuilder.addVirtualMethod(
+          "method3", "Lpackage/A;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+      classBuilder.addVirtualMethod(
+          "method3", "Lpackage/B;", ".limit stack 1", ".limit locals 1", "aconst_null", "areturn");
+      classBuilder.addVirtualMethod(
+          "method3",
+          "Ljava/lang/Object;",
+          ".limit stack 1",
+          ".limit locals 1",
+          "aconst_null",
+          "areturn");
+
+      appBuilder.addInterface("package.A");
+      appBuilder.addInterface("package.B");
+
+      Path proguardMapPath = File.createTempFile("mapping", ".txt", temp.getRoot()).toPath();
+      AndroidApp output =
+          compileWithR8(
+              appBuilder.build(),
+              keepMainProguardConfiguration("package.TestClass"),
+              options -> {
+                options.enableTreeShaking = false;
+                options.proguardMapConsumer = new FileConsumer(proguardMapPath);
+              });
+
+      CodeInspector inspector = new CodeInspector(output, proguardMapPath);
+      ClassSubject clazz = inspector.clazz("package.TestClass");
+      assertThat(clazz, isPresent());
+
+      Map<String, Set<MethodSubject>> methodSubjectsByName = new HashMap<>();
+      for (String name : ImmutableList.of("method1", "method2", "method3")) {
+        methodSubjectsByName.put(
+            name,
+            ImmutableSet.of(
+                clazz.method("java.lang.Object", name, ImmutableList.of()),
+                clazz.method("package.A", name, ImmutableList.of()),
+                clazz.method("package.B", name, ImmutableList.of())));
+      }
+
+      Set<String> minifiedMethodNames = new HashSet<>();
+      for (Set<MethodSubject> methodSubjects : methodSubjectsByName.values()) {
+        for (MethodSubject methodSubject : methodSubjects) {
+          assertThat(methodSubject, isRenamed());
+          minifiedMethodNames.add(methodSubject.getFinalName());
+        }
+      }
+      assertEquals(3, minifiedMethodNames.size());
+    }
+  }
+}
