blob: e7784ccfff783618668c5f30f1336ea89850e0da [file] [log] [blame]
// Copyright (c) 2018, 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.shaking;
import static junit.framework.TestCase.assertEquals;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.utils.AndroidApp;
import org.junit.Test;
public class B112290098 extends TestBase {
@Test
public void test() throws Exception {
String mainClass = TestClass.class.getName();
AndroidApp input = readClasses(TestClass.class, C.class);
AndroidApp output =
compileWithR8(
input,
String.join(
System.lineSeparator(),
"-keep public class " + mainClass + " {",
" public static void main(...);",
"}"));
assertEquals(runOnArt(compileWithD8(input), mainClass), runOnArt(output, mainClass));
}
public static class TestClass {
public static void main(String[] args) {
// Instantiation that will be removed as a result of class inlining.
new C();
C obj = null;
try {
// After inlining this will lead to an iget instruction.
obj.getField();
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException");
}
}
}
public static class C {
// In the second round of tree shaking, C is no longer instantiated, but we should still
// keep this field to avoid a NoSuchFieldError instead of a NullPointerException at the
// obj.getField() invocation.
public int field = 42;
public int getField() {
return field;
}
}
}