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