blob: 1dc280cab3e6a286575ec0da9e0442d92e935059 [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.regress.b116575775;
import static junit.framework.TestCase.assertEquals;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.jasmin.JasminBuilder;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.google.common.collect.ImmutableList;
import java.util.ConcurrentModificationException;
import org.junit.Test;
public class B116575775 extends TestBase {
public void runTest(Class<?> clazz) throws Exception {
CodeInspector inspector =
new CodeInspector(
compileWithR8(
readClasses(clazz),
keepMainProguardConfiguration(clazz)));
// Ensure toBeInlined is inlined, and only main remains.
inspector
.clazz(clazz)
.forAllMethods(m -> assertEquals(m.getOriginalName(), "main"));
}
@Test
public void testDuplicateGuards() throws Exception {
runTest(B116575775Test.class);
}
@Test
public void testDuplicateGuards1() throws Exception {
runTest(B116575775Test1.class);
}
@Test
public void testDuplicateGuards2() throws Exception {
runTest(B116575775Test2.class);
}
@Test
public void testDuplicateGuards3() throws Exception {
runTest(B116575775Test3.class);
}
@Test
public void byteCodeInputWithDuplicateGuards() throws Exception {
JasminBuilder builder = new JasminBuilder();
JasminBuilder.ClassBuilder clazz = builder.addClass("Test");
clazz.addStaticMethod("toBeInlined", ImmutableList.of(), "V",
".limit stack 1",
"LabelTryStart:",
" new java/lang/Object",
" invokespecial java/lang/Object/<init>()V",
"LabelTryEnd:",
" goto LabelRet",
"LabelCatch:", // Entry stack is {java/lang/Throwable}
" pop",
" goto LabelRet",
"LabelRet:",
" return",
".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch"
);
clazz.addMainMethod(
".limit stack 1",
"LabelTryStart:",
" invokestatic Test/toBeInlined()V",
"LabelTryEnd:",
" goto LabelRet",
"LabelCatch:", // Entry stack is {java/lang/Throwable}
" pop",
" goto LabelRet",
"LabelRet:",
" return",
".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/ArithmeticException from LabelTryStart to LabelTryEnd using LabelCatch",
".catch java/lang/IllegalArgumentException from LabelTryStart to LabelTryEnd using LabelCatch");
assertEquals(0, runOnJavaRaw("Test", builder.buildClasses(), ImmutableList.of()).exitCode);
CodeInspector inspector =
new CodeInspector(
compileWithR8(
buildAndroidApp(builder.buildClasses()),
keepMainProguardConfiguration("Test")));
// Ensure toBeInlined is inlined, and only main remains.
inspector
.clazz("Test")
.forAllMethods(m -> assertEquals(m.getOriginalName(), "main"));
}
}
class B116575775Test {
public static void toBeInlined() throws ClassCastException {
try {
new Object();
} catch (IllegalArgumentException | ClassCastException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
try {
toBeInlined();
} catch (IllegalArgumentException | ClassCastException e) {
System.out.println(e);
}
}
}
class B116575775Test1 {
public static void toBeInlined() throws ClassCastException {
try {
new Object();
} catch (IllegalArgumentException | ClassCastException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
try {
toBeInlined();
} catch (IllegalArgumentException | ClassCastException | ArithmeticException e) {
System.out.println(e);
}
}
}
class B116575775Test2 {
public static void toBeInlined() throws ClassCastException {
try {
new Object();
} catch (IllegalArgumentException | ClassCastException | ArithmeticException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
try {
toBeInlined();
} catch (IllegalArgumentException | ClassCastException e) {
System.out.println(e);
}
}
}
class B116575775Test3 {
public static void toBeInlined() throws ClassCastException {
try {
new Object();
} catch (IllegalArgumentException | ClassCastException | ArithmeticException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
try {
toBeInlined();
} catch (IllegalArgumentException | ClassCastException | ConcurrentModificationException e) {
System.out.println(e);
}
}
}