Make existing tests robust towards more aggressive class inlining
Change-Id: I36d7ee13799d4cbbbfd2006cfc7a26a189d2e539
diff --git a/src/test/examples/classmerging/NeverClassInline.java b/src/test/examples/classmerging/NeverClassInline.java
new file mode 100644
index 0000000..2dca10e
--- /dev/null
+++ b/src/test/examples/classmerging/NeverClassInline.java
@@ -0,0 +1,10 @@
+// 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 classmerging;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target({ElementType.TYPE})
+public @interface NeverClassInline {}
diff --git a/src/test/examples/classmerging/ProguardFieldMapTest.java b/src/test/examples/classmerging/ProguardFieldMapTest.java
index 0cbf8a1..e512173 100644
--- a/src/test/examples/classmerging/ProguardFieldMapTest.java
+++ b/src/test/examples/classmerging/ProguardFieldMapTest.java
@@ -16,6 +16,7 @@
public String f = "A.f";
}
+ @NeverClassInline
public static class B extends A {
public void test() {
diff --git a/src/test/examples/classmerging/ProguardMethodMapTest.java b/src/test/examples/classmerging/ProguardMethodMapTest.java
index 9ce0ad7..dd3ccff 100644
--- a/src/test/examples/classmerging/ProguardMethodMapTest.java
+++ b/src/test/examples/classmerging/ProguardMethodMapTest.java
@@ -18,6 +18,7 @@
}
}
+ @NeverClassInline
public static class B extends A {
@Override
diff --git a/src/test/examples/classmerging/keep-rules.txt b/src/test/examples/classmerging/keep-rules.txt
index 11a66c6..5297ee9 100644
--- a/src/test/examples/classmerging/keep-rules.txt
+++ b/src/test/examples/classmerging/keep-rules.txt
@@ -68,6 +68,7 @@
public static void main(...);
}
+-neverclassinline @classmerging.NeverClassInline class *
-neverinline class * {
@classmerging.NeverInline <methods>;
}
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
index f203ade..b8288d8 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/NonConstructorRelaxationTest.java
@@ -36,7 +36,8 @@
@Parameterized.Parameters(name = "{0}, argument removal: {1}")
public static List<Object[]> data() {
- return buildParameters(getTestParameters().withAllRuntimes().build(), BooleanUtils.values());
+ return buildParameters(
+ getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
}
public NonConstructorRelaxationTest(TestParameters parameters, boolean enableArgumentRemoval) {
@@ -99,7 +100,7 @@
" *** pBlah1();",
"}")
.allowAccessModification()
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), mainClass);
assertEquals(
@@ -157,6 +158,7 @@
.addProgramFiles(ToolHelper.getClassFilesForTestPackage(mainClass.getPackage()))
.addKeepMainRule(mainClass)
.addOptionsModification(o -> o.enableVerticalClassMerging = enableVerticalClassMerging)
+ .enableClassInliningAnnotations()
.enableInliningAnnotations()
.enableMemberValuePropagationAnnotations()
.noMinification()
@@ -171,7 +173,7 @@
" *** p*();",
"}")
.allowAccessModification()
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), mainClass);
assertEquals(
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
index 0793001..b45a708 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub1.java
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.accessrelaxation.privateinstance;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
+@NeverClassInline
public class Sub1 extends Base implements Itf1 {
@Override
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
index 018bc90..fbc2ebc 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/privateinstance/Sub2.java
@@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.accessrelaxation.privateinstance;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
+@NeverClassInline
public class Sub2 extends Base implements Itf2 {
@Override
diff --git a/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerInitTest.java b/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerInitTest.java
index 1c4f406..dd41bc9 100644
--- a/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerInitTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerInitTest.java
@@ -8,6 +8,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
@@ -45,6 +46,7 @@
.addInnerClasses(VerticalClassMergerInitTest.class)
.addKeepMainRule(Main.class)
.addMainDexRules("-keep class " + Main.class.getTypeName())
+ .enableClassInliningAnnotations()
.setMinApi(AndroidApiLevel.K_WATCH)
.addOptionsModification(
options -> {
@@ -76,6 +78,7 @@
}
}
+ @NeverClassInline
public static class Child extends Base {
// We need a static member to force the main-dex tracing to include Child and Base.
diff --git a/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerTest.java
index fc3f22f..7fab7a1 100644
--- a/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/VerticalClassMergerTest.java
@@ -509,8 +509,8 @@
" 1:1:void <init>():14:14 -> <init>",
" 2:2:void <init>():16:16 -> <init>",
"classmerging.ProguardFieldMapTest$B -> classmerging.ProguardFieldMapTest$B:",
- " 1:1:void <init>():19:19 -> <init>",
- " 1:1:void test():22:22 -> test");
+ " 1:1:void <init>():20:20 -> <init>",
+ " 1:1:void test():23:23 -> test");
runTestOnInput(
main,
readProgramFiles(programFiles),
@@ -536,10 +536,10 @@
"classmerging.ProguardFieldMapTest$B -> classmerging.ProguardFieldMapTest$B:",
" java.lang.String classmerging.ProguardFieldMapTest$A.f -> f",
" 1:1:void classmerging.ProguardFieldMapTest$A.<init>():14:14 -> <init>",
- " 1:1:void <init>():19 -> <init>",
+ " 1:1:void <init>():20 -> <init>",
" 2:2:void classmerging.ProguardFieldMapTest$A.<init>():16:16 -> <init>",
- " 2:2:void <init>():19 -> <init>",
- " 1:1:void test():22:22 -> test");
+ " 2:2:void <init>():20 -> <init>",
+ " 1:1:void test():23:23 -> test");
Set<String> preservedClassNames =
ImmutableSet.of("classmerging.ProguardFieldMapTest", "classmerging.ProguardFieldMapTest$B");
runTestOnInput(
@@ -577,8 +577,8 @@
" 1:1:void <init>():14:14 -> <init>",
" 1:1:void method():17:17 -> method",
"classmerging.ProguardMethodMapTest$B -> classmerging.ProguardMethodMapTest$B:",
- " 1:1:void <init>():21:21 -> <init>",
- " 1:2:void method():25:26 -> method");
+ " 1:1:void <init>():22:22 -> <init>",
+ " 1:2:void method():26:27 -> method");
runTestOnInput(
main,
readProgramFiles(programFiles),
@@ -606,8 +606,8 @@
// A.<init> has been inlined into B.<init>?
" 1:1:void classmerging.ProguardMethodMapTest$A.<init>():14:14 -> <init>",
// TODO(christofferqa): Should this be " ...<init>():21:21 -> <init>"?
- " 1:1:void <init>():21 -> <init>",
- " 1:2:void method():25:26 -> method",
+ " 1:1:void <init>():22 -> <init>",
+ " 1:2:void method():26:27 -> method",
" 1:1:void classmerging.ProguardMethodMapTest$A.method():17:17 -> "
+ "method$classmerging$ProguardMethodMapTest$A");
Set<String> preservedClassNames =
@@ -647,10 +647,10 @@
"classmerging.ProguardMethodMapTest$A -> classmerging.ProguardMethodMapTest$A:",
" 1:1:void <init>():14:14 -> <init>",
"classmerging.ProguardMethodMapTest$B -> classmerging.ProguardMethodMapTest$B:",
- " 1:1:void <init>():21:21 -> <init>",
- " 1:1:void method():25:25 -> method",
+ " 1:1:void <init>():22:22 -> <init>",
+ " 1:1:void method():26:26 -> method",
" 2:2:void classmerging.ProguardMethodMapTest$A.method():17:17 -> method",
- " 2:2:void method():26 -> method");
+ " 2:2:void method():27 -> method");
runTestOnInput(
main,
readProgramFiles(programFiles),
@@ -677,10 +677,10 @@
" 1:2:void main(java.lang.String[]):10:11 -> main",
"classmerging.ProguardMethodMapTest$B -> classmerging.ProguardMethodMapTest$B:",
" 1:1:void classmerging.ProguardMethodMapTest$A.<init>():14:14 -> <init>",
- " 1:1:void <init>():21 -> <init>",
- " 1:1:void method():25:25 -> method",
+ " 1:1:void <init>():22 -> <init>",
+ " 1:1:void method():26:26 -> method",
" 2:2:void classmerging.ProguardMethodMapTest$A.method():17:17 -> method",
- " 2:2:void method():26 -> method");
+ " 2:2:void method():27 -> method");
Set<String> preservedClassNames =
ImmutableSet.of(
"classmerging.ProguardMethodMapTest", "classmerging.ProguardMethodMapTest$B");
diff --git a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithInvokeInterfaceTestRunner.java b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithInvokeInterfaceTestRunner.java
index b89f09a..c04e3eb 100644
--- a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithInvokeInterfaceTestRunner.java
+++ b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithInvokeInterfaceTestRunner.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestBase;
import com.android.tools.r8.debug.DebugTestBase;
import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.Command;
import com.android.tools.r8.debug.DebugTestConfig;
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
index 07106f3..6b1d25b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
@@ -43,7 +43,7 @@
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters().withAllRuntimes().build();
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
}
public NonNullParamTest(TestParameters parameters) {
@@ -54,7 +54,7 @@
options.enableDevirtualization = false;
}
- CodeInspector buildAndRun(
+ private CodeInspector buildAndRun(
Class<?> mainClass,
Collection<Class<?>> classes,
ThrowableConsumer<R8FullTestBuilder> configuration)
@@ -73,7 +73,7 @@
options.inliningInstructionLimit = 4;
})
.apply(configuration)
- .setMinApi(parameters.getRuntime())
+ .setMinApi(parameters.getApiLevel())
.run(parameters.getRuntime(), mainClass)
.assertSuccessWithOutput(javaOutput)
.inspector();
@@ -184,7 +184,7 @@
NonNullParamAfterInvokeVirtual.class,
NotPinnedClass.class,
mainClass),
- R8TestBuilder::enableInliningAnnotations);
+ builder -> builder.enableClassInliningAnnotations().enableInliningAnnotations());
ClassSubject mainSubject = inspector.clazz(NonNullParamAfterInvokeVirtual.class);
assertThat(mainSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullParamAfterInvokeVirtual.java b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullParamAfterInvokeVirtual.java
index 994c87a..d577644 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullParamAfterInvokeVirtual.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullParamAfterInvokeVirtual.java
@@ -5,8 +5,10 @@
import static com.android.tools.r8.ir.optimize.nonnull.IntrinsicsDeputy.checkParameterIsNotNull;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
+@NeverClassInline
public class NonNullParamAfterInvokeVirtual {
@NeverInline
diff --git a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
index 40cd981..95e7430 100644
--- a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
+++ b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
@@ -9,6 +9,7 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assume.assumeFalse;
+import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.ProguardTestBuilder;
import com.android.tools.r8.R8FullTestBuilder;
import com.android.tools.r8.TestBase;
@@ -63,6 +64,7 @@
byte foo();
}
+@NeverClassInline
class SomeClass implements SomeInterface {
@Override
public byte foo() {
@@ -81,7 +83,8 @@
public class B130791310 extends TestBase {
private static final Class<?> MAIN = TestClass.class;
private static final List<Class<?>> CLASSES =
- ImmutableList.of(MAIN, SomeLogic.class, SomeInterface.class, SomeClass.class);
+ ImmutableList.of(
+ MAIN, SomeLogic.class, SomeInterface.class, SomeClass.class, NeverClassInline.class);
private static final String RULES = StringUtils.lines(
"-keepnames class **.SomeLogic {",
" **.SomeInterface someMethod(**.SomeClass);",
@@ -149,7 +152,8 @@
.addProgramClasses(CLASSES)
.addLibraryFiles(ToolHelper.getDefaultAndroidJar())
.addKeepClassAndMembersRules(MAIN)
- .addKeepRules(RULES);
+ .addKeepRules(RULES)
+ .enableClassInliningAnnotations();
if (!enableClassMerging) {
builder.addOptionsModification(o -> o.enableVerticalClassMerging = false);
}