blob: 9b78e3eb249cf3f49e073c95ac6de1b6497152ed [file] [log] [blame]
// Copyright (c) 2020, 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.classmerging.horizontal;
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.NeverClassInline;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestParameters;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class VirtualMethodMergingOfPublicizedMethodsTest extends HorizontalClassMergingTestBase {
public VirtualMethodMergingOfPublicizedMethodsTest(
TestParameters parameters, boolean enableHorizontalClassMerging) {
super(parameters, enableHorizontalClassMerging);
}
@Test
public void test() throws Exception {
if (enableHorizontalClassMerging) {
thrown.expect(CompilationFailedException.class);
}
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.addKeepMainRule(TestClass.class)
.addOptionsModification(
options -> options.enableHorizontalClassMerging = enableHorizontalClassMerging)
.allowAccessModification()
.enableInliningAnnotations()
.enableNeverClassInliningAnnotations()
.setMinApi(parameters.getApiLevel())
.compile()
.run(parameters.getRuntime(), TestClass.class)
.assertSuccessWithOutputLines(
"A.privateAndPrivate()",
"B.privateAndPrivate()",
"A.privateAndPackagePrivate()",
"B.privateAndPackagePrivate()",
"A.privateAndPublic()",
"B.privateAndPublic()",
"A.packagePrivateAndPrivate()",
"B.packagePrivateAndPrivate()",
"A.packagePrivateAndPackagePrivate()",
"B.packagePrivateAndPackagePrivate()",
"A.packagePrivateAndPublic()",
"B.packagePrivateAndPublic()",
"A.publicAndPrivate()",
"B.publicAndPrivate()",
"A.publicAndPackagePrivate()",
"B.publicAndPackagePrivate()",
"A.publicAndPublic()",
"B.publicAndPublic()");
}
static class TestClass {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.privateAndPrivate();
b.privateAndPrivate();
a.privateAndPackagePrivate();
b.privateAndPackagePrivate();
a.privateAndPublic();
b.privateAndPublic();
a.packagePrivateAndPrivate();
b.packagePrivateAndPrivate();
a.packagePrivateAndPackagePrivate();
b.packagePrivateAndPackagePrivate();
a.packagePrivateAndPublic();
b.packagePrivateAndPublic();
a.publicAndPrivate();
b.publicAndPrivate();
a.publicAndPackagePrivate();
b.publicAndPackagePrivate();
a.publicAndPublic();
b.publicAndPublic();
}
}
@NeverClassInline
static class A {
@NeverInline
private void privateAndPrivate() {
System.out.println("A.privateAndPrivate()");
}
@NeverInline
private void privateAndPackagePrivate() {
System.out.println("A.privateAndPackagePrivate()");
}
@NeverInline
private void privateAndPublic() {
System.out.println("A.privateAndPublic()");
}
@NeverInline
void packagePrivateAndPrivate() {
System.out.println("A.packagePrivateAndPrivate()");
}
@NeverInline
void packagePrivateAndPackagePrivate() {
System.out.println("A.packagePrivateAndPackagePrivate()");
}
@NeverInline
void packagePrivateAndPublic() {
System.out.println("A.packagePrivateAndPublic()");
}
@NeverInline
public void publicAndPrivate() {
System.out.println("A.publicAndPrivate()");
}
@NeverInline
public void publicAndPackagePrivate() {
System.out.println("A.publicAndPackagePrivate()");
}
@NeverInline
public void publicAndPublic() {
System.out.println("A.publicAndPublic()");
}
}
@NeverClassInline
static class B {
@NeverInline
private void privateAndPrivate() {
System.out.println("B.privateAndPrivate()");
}
@NeverInline
void privateAndPackagePrivate() {
System.out.println("B.privateAndPackagePrivate()");
}
@NeverInline
public void privateAndPublic() {
System.out.println("B.privateAndPublic()");
}
@NeverInline
private void packagePrivateAndPrivate() {
System.out.println("B.packagePrivateAndPrivate()");
}
@NeverInline
void packagePrivateAndPackagePrivate() {
System.out.println("B.packagePrivateAndPackagePrivate()");
}
@NeverInline
public void packagePrivateAndPublic() {
System.out.println("B.packagePrivateAndPublic()");
}
@NeverInline
private void publicAndPrivate() {
System.out.println("B.publicAndPrivate()");
}
@NeverInline
void publicAndPackagePrivate() {
System.out.println("B.publicAndPackagePrivate()");
}
@NeverInline
public void publicAndPublic() {
System.out.println("B.publicAndPublic()");
}
}
}