Add test for not inlining call to checkNotNullParameter

Bug: 139276374
Change-Id: I381dc94d181fe48833e3d5118658b291027cd811
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
new file mode 100644
index 0000000..4fcc710
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineChainTest.java
@@ -0,0 +1,90 @@
+// Copyright (c) 2021, 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.kotlin;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
+import com.android.tools.r8.KotlinTestBase;
+import com.android.tools.r8.KotlinTestParameters;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class KotlinIntrinsicsInlineChainTest extends KotlinTestBase {
+
+  private static final String FOLDER = "intrinsics";
+  private static final String MAIN = FOLDER + ".InlineChainParameterCheckKt";
+
+  @Parameterized.Parameters(name = "{0}, {1}, allowAccessModification: {2}")
+  public static Collection<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(),
+        getKotlinTestParameters().withAllCompilersAndTargetVersions().build(),
+        BooleanUtils.values());
+  }
+
+  private final TestParameters parameters;
+  private final boolean allowAccessModification;
+
+  public KotlinIntrinsicsInlineChainTest(
+      TestParameters parameters,
+      KotlinTestParameters kotlinParameters,
+      boolean allowAccessModification) {
+    super(kotlinParameters);
+    this.parameters = parameters;
+    this.allowAccessModification = allowAccessModification;
+  }
+
+  private static final KotlinCompileMemoizer compiledJars =
+      getCompileMemoizer(getKotlinFilesInResource(FOLDER), FOLDER)
+          .configure(kotlinCompilerTool -> kotlinCompilerTool.includeRuntime().noReflect());
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramFiles(
+            compiledJars.getForConfiguration(kotlinc, targetVersion),
+            kotlinc.getKotlinAnnotationJar())
+        .addKeepMainRule(MAIN)
+        .allowAccessModification(allowAccessModification)
+        .allowDiagnosticWarningMessages()
+        .setMinApi(parameters.getApiLevel())
+        .noMinification()
+        .compile()
+        .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
+        .run(parameters.getRuntime(), MAIN, "foobar")
+        .assertSuccessWithOutputLines("foobar", "field is foobar")
+        .inspect(
+            inspector -> {
+              ClassSubject mainClass = inspector.clazz(MAIN);
+              assertThat(mainClass, isPresent());
+
+              // Check that we have inlined all methods into main method.
+              assertEquals(1, mainClass.allMethods().size());
+
+              // Count the number of check parameter is not null.
+              MethodSubject main = mainClass.mainMethod();
+              long checkParameterIsNotNull = countCall(main, "checkParameterIsNotNull");
+              long checkNotNullParameter = countCall(main, "checkNotNullParameter");
+              if (kotlinParameters.is(KotlinCompilerVersion.KOTLINC_1_3_72)) {
+                assertEquals(allowAccessModification ? 0 : 1, checkParameterIsNotNull);
+                assertEquals(0, checkNotNullParameter);
+              } else {
+                // TODO(b/139276374): Update such that this is call is inlined.
+                assertEquals(1, checkNotNullParameter);
+                assertEquals(0, checkParameterIsNotNull);
+              }
+            });
+  }
+}
diff --git a/src/test/kotlinR8TestResources/intrinsics/inlineChainParameterCheck.kt b/src/test/kotlinR8TestResources/intrinsics/inlineChainParameterCheck.kt
new file mode 100644
index 0000000..e77fab7
--- /dev/null
+++ b/src/test/kotlinR8TestResources/intrinsics/inlineChainParameterCheck.kt
@@ -0,0 +1,17 @@
+// Copyright (c) 2021, 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 intrinsics
+
+fun foo(field: String) {
+  println("field is " + field)
+}
+
+fun bar(field : String) {
+  println(field)
+  foo(field)
+}
+
+fun main(args : Array<String>) {
+  bar((if (args.size > 0) args.get(0) else null) as String)
+}
\ No newline at end of file