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));
+  }
+}