Nest constructor bridge arg removal

- fixed assertion in LensCodeRewriter for nest constructor
  and arg removal
- fixed assertion in R8 when no minification/no treeshaking/
  no applymapping
- extend test for Nest constructor bridge and arg removal
  (existing test was not performing as intended)

Bug: 142042549
Change-Id: Iedd4a422ccc994968993cf9df1d00505835a68f3
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 91b6ab7..a7d57b1 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -765,7 +765,11 @@
 
       // Validity checks.
       assert application.classes().stream().allMatch(clazz -> clazz.isValid(options));
-      assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo());
+      if (options.isShrinking()
+          || options.isMinifying()
+          || options.getProguardConfiguration().hasApplyMappingFile()) {
+        assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo());
+      }
       assert appView
           .graphLense()
           .verifyMappingToOriginalProgram(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
index 229f3a6..ef5da18 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -241,8 +241,6 @@
                   newInValues.add(invoke.inValues().get(i));
                 }
               }
-              assert newInValues.size()
-                  == actualTarget.proto.parameters.size() + (actualInvokeType == STATIC ? 0 : 1);
             } else {
               newInValues = invoke.inValues();
             }
@@ -254,6 +252,9 @@
               newInValues.add(extraNullValue);
             }
 
+            assert newInValues.size()
+                == actualTarget.proto.parameters.size() + (actualInvokeType == STATIC ? 0 : 1);
+
             Invoke newInvoke =
                 Invoke.create(actualInvokeType, actualTarget, null, newOutValue, newInValues);
             iterator.replaceCurrentInstruction(newInvoke);
diff --git a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java b/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
index f3ee216..1326c8f 100644
--- a/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
+++ b/src/test/examplesJava11/nesthostexample/BasicNestHostWithInnerClassConstructors.java
@@ -28,8 +28,12 @@
       this.field = field;
     }
 
-    private BasicNestedClass(String unused, String field, String alsoUnused) {
-      this.field = field + "UnusedConstructor";
+    private BasicNestedClass(Object unused, Object field, Object alsoUnused) {
+      this.field = field.toString() + "UnusedConstructor";
+    }
+
+    private BasicNestedClass(UnInstantiatedClass instance, UnInstantiatedClass otherInstance) {
+      this.field = "nothing";
     }
 
     public static BasicNestHostWithInnerClassConstructors createOuterInstance(String field) {
@@ -37,6 +41,8 @@
     }
   }
 
+  public static class UnInstantiatedClass {}
+
   public static void main(String[] args) {
     BasicNestHostWithInnerClassConstructors outer = BasicNestedClass.createOuterInstance("field");
     BasicNestedClass inner =
@@ -44,11 +50,13 @@
     BasicNestHostWithInnerClassConstructors noBridge =
         new BasicNestHostWithInnerClassConstructors(1);
     BasicNestedClass unusedParamConstructor =
-        new BasicNestedClass("unused", "innerField", "alsoUnused");
+        new BasicNestedClass(new Object(), "innerField", new Object());
+    BasicNestedClass uninstantiatedParamConstructor = new BasicNestedClass(null, null);
 
     System.out.println(outer.field);
     System.out.println(inner.field);
     System.out.println(noBridge.field);
     System.out.println(unusedParamConstructor.field);
+    System.out.println(uninstantiatedParamConstructor.field);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
index 2838b43..a9fcd68 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAccessControlTestUtils.java
@@ -33,6 +33,7 @@
           "BasicNestHostWithInnerClassMethods$BasicNestedClass",
           "BasicNestHostWithInnerClassConstructors",
           "BasicNestHostWithInnerClassConstructors$BasicNestedClass",
+          "BasicNestHostWithInnerClassConstructors$UnInstantiatedClass",
           "BasicNestHostWithAnonymousInnerClass",
           "BasicNestHostWithAnonymousInnerClass$1",
           "BasicNestHostWithAnonymousInnerClass$InterfaceForAnonymousClass",
@@ -128,7 +129,8 @@
                   "hostMethodstaticHostMethodstaticNestMethod"))
           .put(
               "constructors",
-              StringUtils.lines("field", "nest1SField", "1", "innerFieldUnusedConstructor"))
+              StringUtils.lines(
+                  "field", "nest1SField", "1", "innerFieldUnusedConstructor", "nothing"))
           .put(
               "anonymous",
               StringUtils.lines(
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java
new file mode 100644
index 0000000..1ed0e0a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestConstructorRemovedArgTest.java
@@ -0,0 +1,74 @@
+// Copyright (c) 2019, 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.desugar.nestaccesscontrol;
+
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.classesOfNest;
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.getExpectedResult;
+import static com.android.tools.r8.desugar.nestaccesscontrol.NestAccessControlTestUtils.getMainClass;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm;
+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 NestConstructorRemovedArgTest extends TestBase {
+
+  public NestConstructorRemovedArgTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
+        .withDexRuntime(DexVm.Version.first())
+        .withDexRuntime(DexVm.Version.last())
+        .withAllApiLevels()
+        .build();
+  }
+
+  @Test
+  public void testRemoveArgConstructorNestsR8() throws Exception {
+    String nestID = "constructors";
+    testForR8(parameters.getBackend())
+        .addKeepMainRule(getMainClass(nestID))
+        .noMinification()
+        .setMinApi(parameters.getApiLevel())
+        .addOptionsModification(
+            options -> {
+              options.enableClassInlining = false;
+            })
+        .addProgramFiles(classesOfNest(nestID))
+        .compile()
+        .run(parameters.getRuntime(), getMainClass(nestID))
+        .assertSuccessWithOutput(getExpectedResult(nestID));
+  }
+
+  @Test
+  public void testRemoveArgConstructorNestsR8NoTreeShaking() throws Exception {
+    String nestID = "constructors";
+    testForR8(parameters.getBackend())
+        .noTreeShaking()
+        .addKeepMainRule(getMainClass(nestID))
+        .noMinification()
+        .setMinApi(parameters.getApiLevel())
+        .addOptionsModification(
+            options -> {
+              options.enableClassInlining = false;
+            })
+        .addProgramFiles(classesOfNest(nestID))
+        .compile()
+        .run(parameters.getRuntime(), getMainClass(nestID))
+        .assertSuccessWithOutput(getExpectedResult(nestID));
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
index 0f89cbb..bb59533 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestOnProgramAndClassPathTest.java
@@ -73,7 +73,7 @@
             containsString("BasicNestHostWithInnerClassConstructors$BasicNestedClass"));
     inner.inspect(
         inspector -> {
-          assertThisNumberOfBridges(inspector, 2);
+          assertThisNumberOfBridges(inspector, 3);
           assertNestConstructor(inspector);
         });
     D8TestCompileResult host =