Make class instantiated when a constructor method handle is seen
Bug: 71604169
Change-Id: If97409e4f495d21afee7d5408b30f8ad0113355a
diff --git a/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java b/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java
index 3321cb7..f9a7f49 100644
--- a/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java
+++ b/src/main/java/com/android/tools/r8/jar/JarRegisterEffectsVisitor.java
@@ -150,6 +150,7 @@
Opcodes.INVOKESTATIC, handle.getOwner(), handle.getName(), handle.getDesc(), false);
break;
case Opcodes.H_NEWINVOKESPECIAL:
+ registry.registerNewInstance(application.getTypeFromName(handle.getOwner()));
visitMethodInsn(
Opcodes.INVOKESPECIAL, handle.getOwner(), handle.getName(), handle.getDesc(), false);
break;
diff --git a/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169.java b/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169.java
new file mode 100644
index 0000000..90935bd
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169.java
@@ -0,0 +1,28 @@
+// 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.regress.b71604169;
+
+public class Regress71604169 {
+ public interface Creator<C> {
+ C create(Object o);
+ }
+
+ public static class X {
+ Object o;
+
+ X(Object o) {
+ this.o = o;
+ System.out.print(o);
+ }
+ }
+
+ public static <C> C create(Creator<C> creator) {
+ return creator.create("Hello, world!");
+ }
+
+ public static void main(String[] args) {
+ create(X::new);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169Test.java b/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169Test.java
new file mode 100644
index 0000000..f40ecfd
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/regress/b71604169/Regress71604169Test.java
@@ -0,0 +1,34 @@
+// 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.regress.b71604169;
+
+import static junit.framework.TestCase.assertEquals;
+
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.Origin;
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+public class Regress71604169Test extends TestBase {
+ @Test
+ public void test() throws Exception {
+ R8Command.Builder builder = R8Command.builder();
+ // Add application classes.
+ Class mainClass = Regress71604169.class;
+ builder.addProgramFiles(ToolHelper.getClassFileForTestClass(mainClass));
+ builder.addProgramFiles(ToolHelper.getClassFileForTestClass(Regress71604169.X.class));
+ builder.addProgramFiles(ToolHelper.getClassFileForTestClass(Regress71604169.Creator.class));
+
+ // Keep main class.
+ builder.addProguardConfiguration(
+ ImmutableList.of(keepMainProguardConfiguration(mainClass, true, false)), Origin.unknown());
+
+ builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
+ assertEquals("Hello, world!", runOnArt(ToolHelper.runR8(builder.build()), mainClass));
+ }
+}