Move Twr test to java 9 package

Change-Id: Ib89e36424acf82fcfe3f3ecaaec7aeaa7643fe02
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index ecffa3a..1e32ba4 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -193,6 +193,7 @@
               from(compileOutput) {
                 include("${exampleDir.name}/**/*.class")
                 exclude("**/TestGenerator*")
+                exclude("${exampleDir.name}/twr/**")
               }
               // Copy additional resources into the jar.
               from(exampleDir) {
diff --git a/d8_r8/test/build.gradle.kts b/d8_r8/test/build.gradle.kts
index f1edea2..30933b4 100644
--- a/d8_r8/test/build.gradle.kts
+++ b/d8_r8/test/build.gradle.kts
@@ -31,6 +31,7 @@
 val javaTestBaseJarTask = projectTask("testbase", "testJar")
 val javaTestBaseDepsJar = projectTask("testbase", "depsJar")
 val java8TestJarTask = projectTask("tests_java_8", "testJar")
+val java9TestJarTask = projectTask("tests_java_9", "testJar")
 val java11TestJarTask = projectTask("tests_java_11", "testJar")
 val java17TestJarTask = projectTask("tests_java_17", "testJar")
 val java21TestJarTask = projectTask("tests_java_21", "testJar")
@@ -64,11 +65,13 @@
 
   val packageTests by registering(Jar::class) {
     dependsOn(java8TestJarTask)
+    dependsOn(java9TestJarTask)
     dependsOn(java11TestJarTask)
     dependsOn(java17TestJarTask)
     dependsOn(java21TestJarTask)
     dependsOn(bootstrapTestJarTask)
     from(java8TestJarTask.outputs.files.map(::zipTree))
+    from(java9TestJarTask.outputs.files.map(::zipTree))
     from(java11TestJarTask.outputs.files.map(::zipTree))
     from(java17TestJarTask.outputs.files.map(::zipTree))
     from(java21TestJarTask.outputs.files.map(::zipTree))
diff --git a/d8_r8/test_modules/tests_java_9/build.gradle.kts b/d8_r8/test_modules/tests_java_9/build.gradle.kts
index 136a506..6ac2d1b 100644
--- a/d8_r8/test_modules/tests_java_9/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/build.gradle.kts
@@ -19,9 +19,21 @@
   }
   sourceCompatibility = JavaVersion.VERSION_1_9
   targetCompatibility = JavaVersion.VERSION_1_9
+  toolchain {
+    languageVersion = JavaLanguageVersion.of(JvmCompatibility.release)
+  }
 }
 
-dependencies { }
+val testbaseJavaCompileTask = projectTask("testbase", "compileJava")
+val testbaseDepsJarTask = projectTask("testbase", "depsJar")
+val mainCompileTask = projectTask("main", "compileJava")
+
+dependencies {
+  implementation(files(testbaseDepsJarTask.outputs.files.getSingleFile()))
+  implementation(testbaseJavaCompileTask.outputs.files)
+  implementation(mainCompileTask.outputs.files)
+  implementation(projectTask("main", "processResources").outputs.files)
+}
 
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava9")
@@ -29,9 +41,27 @@
 tasks {
   withType<JavaCompile> {
     dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
-    options.setFork(true)
-    options.forkOptions.memoryMaximumSize = "3g"
-    options.forkOptions.executable = getCompilerPath(Jdk.JDK_9)
+  }
+
+  withType<Test> {
+    notCompatibleWithConfigurationCache(
+      "Failure storing the configuration cache: cannot serialize object of type 'org.gradle.api.internal.project.DefaultProject', a subtype of 'org.gradle.api.Project', as these are not supported with the configuration cache")
+    TestingState.setUpTestingState(this)
+    systemProperty("TEST_DATA_LOCATION",
+      // This should be
+      //   layout.buildDirectory.dir("classes/java/test").get().toString()
+      // once the use of 'buildExampleJars' above is removed.
+                   getRoot().resolveAll("build", "test", "examplesJava9", "classes"))
+    systemProperty("TESTBASE_DATA_LOCATION",
+                   testbaseJavaCompileTask.outputs.files.getAsPath().split(File.pathSeparator)[0])
+  }
+
+  val testJar by registering(Jar::class) {
+    from(sourceSets.test.get().output)
+    // TODO(b/296486206): Seems like IntelliJ has a problem depending on test source sets. Renaming
+    //  this from the default name (tests_java_8.jar) will allow IntelliJ to find the resources in
+    //  the jar and not show red underlines. However, navigation to base classes will not work.
+    archiveFileName.set("not_named_tests_java_9.jar")
   }
 }
 
diff --git a/d8_r8/test_modules/tests_java_9/settings.gradle.kts b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
index ad1c8ab..8a58cdb 100644
--- a/d8_r8/test_modules/tests_java_9/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
@@ -23,4 +23,7 @@
 
 rootProject.name = "tests_java_9"
 val root = rootProject.projectDir.parentFile.parentFile
+
 includeBuild(root.resolve("shared"))
+includeBuild(root.resolve("main"))
+includeBuild(root.resolve("test_modules").resolve("testbase"))
\ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java b/src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
similarity index 85%
rename from src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
rename to src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
index 6c03e85..573fc99 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
+++ b/src/test/examplesJava9/twr/twraddsuppressed/TwrSuppressedExceptionsTest.java
@@ -1,7 +1,7 @@
 // Copyright (c) 2022, 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.desugar.suppressedexceptions;
+package twr.twraddsuppressed;
 
 import static org.junit.Assert.assertEquals;
 
@@ -11,14 +11,12 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
 import com.android.tools.r8.utils.IntBox;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
 import java.util.List;
 import java.util.stream.Collectors;
 import org.junit.Test;
@@ -26,13 +24,13 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
+import twr.twraddsuppressed.asm.TestClass$MyClosableDump;
+import twr.twraddsuppressed.asm.TestClassDump;
 
 @RunWith(Parameterized.class)
 public class TwrSuppressedExceptionsTest extends TestBase {
 
-  private static final String PKG = "twraddsuppressed";
-  private static final String EXAMPLE = "examplesJava9/" + PKG;
-  private final JavaExampleClassProxy MAIN = new JavaExampleClassProxy(EXAMPLE, PKG + ".TestClass");
+  private static final String TEST_CLASS = "twr.twraddsuppressed.TestClass";
 
   @Parameter(0)
   public TestParameters parameters;
@@ -67,21 +65,21 @@
         || parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevelWithTwrCloseResourceSupport());
   }
 
-  public List<Path> getProgramInputs() {
-    return ImmutableList.of(JavaExampleClassProxy.examplesJar(EXAMPLE));
+  public List<byte[]> getProgramInputs() throws Exception {
+    return ImmutableList.of(TestClassDump.dump(), TestClass$MyClosableDump.dump());
   }
 
   @Test
   public void testD8() throws Exception {
     testForDesugaring(parameters)
-        .addProgramFiles(getProgramInputs())
-        .run(parameters.getRuntime(), MAIN.typeName())
+        .addProgramClassFileData(getProgramInputs())
+        .run(parameters.getRuntime(), TEST_CLASS)
         .assertSuccessWithOutput(
             runtimeHasSuppressedExceptionsSupport() ? StringUtils.lines("CLOSE") : "NONE")
         .inspectIf(
             DesugarTestConfiguration::isDesugared,
             inspector -> {
-              ClassSubject clazz = inspector.clazz(MAIN.typeName());
+              ClassSubject clazz = inspector.clazz(TEST_CLASS);
               hasInvokesTo(
                   clazz.uniqueMethodWithOriginalName("bar"),
                   // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
@@ -102,7 +100,7 @@
         .inspectIf(
             DesugarTestConfiguration::isNotDesugared,
             inspector -> {
-              ClassSubject clazz = inspector.clazz(MAIN.typeName());
+              ClassSubject clazz = inspector.clazz(TEST_CLASS);
               // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
               hasInvokesTo(clazz.uniqueMethodWithOriginalName("bar"), "$closeResource", 4);
               hasInvokesTo(clazz.mainMethod(), "getSuppressed", 1);
@@ -113,9 +111,9 @@
   public void testR8() throws Exception {
     parameters.assumeR8TestParameters();
     testForR8(parameters.getBackend())
-        .addProgramFiles(getProgramInputs())
+        .addProgramClassFileData(getProgramInputs())
         .setMinApi(parameters)
-        .addKeepMainRule(MAIN.typeName())
+        .addKeepMainRule(TEST_CLASS)
         // TODO(b/214250388): Don't warn about AutoClosable in synthesized code.
         .apply(
             b -> {
@@ -123,7 +121,7 @@
                 b.addDontWarn(AutoCloseable.class);
               }
             })
-        .run(parameters.getRuntime(), MAIN.typeName())
+        .run(parameters.getRuntime(), TEST_CLASS)
         .assertSuccessWithOutput(
             runtimeHasSuppressedExceptionsSupport() ? StringUtils.lines("CLOSE") : "NONE")
         .inspect(
@@ -138,7 +136,7 @@
                             adds.increment(getInvokesTo(m, "addSuppressed").size());
                           }));
               if (apiLevelHasSuppressedExceptionsSupport(parameters.isDexRuntime())) {
-                hasInvokesTo(inspector.clazz(MAIN.typeName()).mainMethod(), "getSuppressed", 1);
+                hasInvokesTo(inspector.clazz(TEST_CLASS).mainMethod(), "getSuppressed", 1);
                 assertEquals(1, gets.get());
                 assertEquals(1, adds.get());
               } else {
diff --git a/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java
new file mode 100644
index 0000000..039d6c2
--- /dev/null
+++ b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClass$MyClosableDump.java
@@ -0,0 +1,80 @@
+// Copyright (c) 2024, 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 twr.twraddsuppressed.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TestClass$MyClosableDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twraddsuppressed/TestClass$MyClosable",
+        null,
+        "java/lang/Object",
+        new String[] {"java/io/Closeable"});
+
+    classWriter.visitSource("TestClass.java", null);
+
+    classWriter.visitInnerClass(
+        "twr/twraddsuppressed/TestClass$MyClosable",
+        "twr/twraddsuppressed/TestClass",
+        "MyClosable",
+        ACC_PUBLIC | ACC_STATIC);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(10, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwraddsuppressed/TestClass$MyClosable;", null, label0, label1, 0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "close", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(14, label0);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitLdcInsn("CLOSE");
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitInsn(ATHROW);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwraddsuppressed/TestClass$MyClosable;", null, label0, label1, 0);
+      methodVisitor.visitMaxs(3, 1);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java
new file mode 100644
index 0000000..6c26a69
--- /dev/null
+++ b/src/test/examplesJava9/twr/twraddsuppressed/asm/TestClassDump.java
@@ -0,0 +1,398 @@
+// Copyright (c) 2024, 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.
+
+/**
+ * Dump of class file for twr.twraddsuppressed.TestClass
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twraddsuppressed;
+ *
+ * <p>import java.io.Closeable;
+ *
+ * <p>public class TestClass {
+ *
+ * <p>public static class MyClosable implements Closeable { @Override public void close() { throw
+ * new RuntimeException("CLOSE"); } }
+ *
+ * <p>public static void foo() { throw new RuntimeException("FOO"); }
+ *
+ * <p>public static void bar() { // NOTE: The $closeResource helper is _only_ generated by the JDK-9
+ * compiler. // // Use twr twice to have javac generate a shared $closeResource helper. try
+ * (MyClosable closable = new MyClosable()) { foo(); } try (MyClosable closable = new MyClosable())
+ * { foo(); } }
+ *
+ * <p>public static void main(String[] args) { try { bar(); } catch (Exception e) { Throwable[]
+ * suppressed = e.getSuppressed(); if (suppressed.length == 0) { System.out.println("NONE"); } else
+ * { for (Throwable throwable : suppressed) { System.out.println(throwable.getMessage()); } } } } }
+ */
+package twr.twraddsuppressed.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TestClassDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twraddsuppressed/TestClass",
+        null,
+        "java/lang/Object",
+        null);
+
+    classWriter.visitSource("TestClass.java", null);
+
+    classWriter.visitInnerClass(
+        "twr/twraddsuppressed/TestClass$MyClosable",
+        "twr/twraddsuppressed/TestClass",
+        "MyClosable",
+        ACC_PUBLIC | ACC_STATIC);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(8, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwraddsuppressed/TestClass;", null, label0, label1, 0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_STATIC, "foo", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(19, label0);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitLdcInsn("FOO");
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitMaxs(3, 0);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC | ACC_STATIC, "bar", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+      Label label4 = new Label();
+      methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+      Label label5 = new Label();
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Throwable");
+      Label label8 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+      Label label9 = new Label();
+      methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+      Label label10 = new Label();
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(24, label10);
+      methodVisitor.visitTypeInsn(NEW, "twr/twraddsuppressed/TestClass$MyClosable");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "twr/twraddsuppressed/TestClass$MyClosable", "<init>", "()V", false);
+      methodVisitor.visitVarInsn(ASTORE, 0);
+      Label label11 = new Label();
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(25, label0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC, "twr/twraddsuppressed/TestClass", "foo", "()V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(26, label1);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twraddsuppressed/TestClass",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      Label label12 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label12);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(24, label2);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {"twr/twraddsuppressed/TestClass$MyClosable", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(26, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twraddsuppressed/TestClass",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitLineNumber(27, label12);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "twr/twraddsuppressed/TestClass$MyClosable");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "twr/twraddsuppressed/TestClass$MyClosable", "<init>", "()V", false);
+      methodVisitor.visitVarInsn(ASTORE, 0);
+      Label label13 = new Label();
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(28, label5);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC, "twr/twraddsuppressed/TestClass", "foo", "()V", false);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(29, label6);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twraddsuppressed/TestClass",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      Label label14 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label14);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(27, label7);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {"twr/twraddsuppressed/TestClass$MyClosable", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitLineNumber(29, label8);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twraddsuppressed/TestClass",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitLineNumber(30, label14);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      methodVisitor.visitLocalVariable(
+          "closable", "Ltwraddsuppressed/TestClass$MyClosable;", null, label11, label12, 0);
+      methodVisitor.visitLocalVariable(
+          "closable", "Ltwraddsuppressed/TestClass$MyClosable;", null, label13, label14, 0);
+      methodVisitor.visitMaxs(2, 5);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Exception");
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(34, label0);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC, "twr/twraddsuppressed/TestClass", "bar", "()V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(44, label1);
+      Label label3 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label3);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(35, label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label4 = new Label();
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitLineNumber(36, label4);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Exception", "getSuppressed", "()[Ljava/lang/Throwable;", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label5 = new Label();
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(37, label5);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitInsn(ARRAYLENGTH);
+      Label label6 = new Label();
+      methodVisitor.visitJumpInsn(IFNE, label6);
+      Label label7 = new Label();
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(38, label7);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("NONE");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label3);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(40, label6);
+      methodVisitor.visitFrame(
+          Opcodes.F_APPEND,
+          2,
+          new Object[] {"java/lang/Exception", "[Ljava/lang/Throwable;"},
+          0,
+          null);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ARRAYLENGTH);
+      methodVisitor.visitVarInsn(ISTORE, 4);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitVarInsn(ISTORE, 5);
+      Label label8 = new Label();
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitFrame(
+          Opcodes.F_APPEND,
+          3,
+          new Object[] {"[Ljava/lang/Throwable;", Opcodes.INTEGER, Opcodes.INTEGER},
+          0,
+          null);
+      methodVisitor.visitVarInsn(ILOAD, 5);
+      methodVisitor.visitVarInsn(ILOAD, 4);
+      methodVisitor.visitJumpInsn(IF_ICMPGE, label3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ILOAD, 5);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      Label label9 = new Label();
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(41, label9);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "getMessage", "()Ljava/lang/String;", false);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label10 = new Label();
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(40, label10);
+      methodVisitor.visitIincInsn(5, 1);
+      methodVisitor.visitJumpInsn(GOTO, label8);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(45, label3);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL, 1, new Object[] {"[Ljava/lang/String;"}, 0, new Object[] {});
+      methodVisitor.visitInsn(RETURN);
+      Label label11 = new Label();
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitLocalVariable(
+          "throwable", "Ljava/lang/Throwable;", null, label9, label10, 6);
+      methodVisitor.visitLocalVariable(
+          "suppressed", "[Ljava/lang/Throwable;", null, label5, label3, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label4, label3, 1);
+      methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label11, 0);
+      methodVisitor.visitMaxs(2, 7);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+              "$closeResource",
+              "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+              null,
+              null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(26, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      Label label4 = new Label();
+      methodVisitor.visitJumpInsn(IFNULL, label4);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label1);
+      Label label5 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+      methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+      methodVisitor.visitMaxs(2, 3);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java b/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java
new file mode 100644
index 0000000..1f4f474
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/TwrCloseResourceRunnerTest.java
@@ -0,0 +1,89 @@
+// Copyright (c) 2024, 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 twr.twrcloseresource;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+import twr.twrcloseresource.asm.IfaceDump;
+import twr.twrcloseresource.asm.TwrCloseResourceTestDump;
+
+@RunWith(Parameterized.class)
+public class TwrCloseResourceRunnerTest extends TestBase {
+
+  public static Path ANY_REACHABLE_JAR = Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR, "flow.jar");
+
+  private static final String EXPECTED_RESULT =
+      "A\n" + "E\n" + "G\n" + "H\n" + "I\n" + "J\n" + "K\n" + "iA\n" + "iE\n" + "iG\n" + "iH\n"
+          + "iI\n" + "iJ\n" + "iK\n" + "1\n" + "2\n" + "3\n" + "4\n" + "5\n" + "6\n" + "7\n" + "8\n"
+          + "99\n" + "i1\n" + "i2\n" + "i3\n" + "i4\n" + "i5\n" + "i6\n" + "i7\n" + "i8\n"
+          + "i99\n";
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withCfRuntimesStartingFromIncluding(CfVm.JDK9)
+        .withDexRuntimes()
+        .withAllApiLevelsAlsoForCf()
+        .build();
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(IfaceDump.dump(), TwrCloseResourceTestDump.dump())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
+        .setMinApi(parameters)
+        .run(
+            parameters.getRuntime(),
+            "twr.twrcloseresource.TwrCloseResourceTest",
+            ANY_REACHABLE_JAR.toAbsolutePath().toString())
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    parameters.assumeRuntimeTestParameters();
+    testForR8(parameters.getBackend())
+        .addProgramClassFileData(IfaceDump.dump(), TwrCloseResourceTestDump.dump())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
+        .setMinApi(parameters)
+        .setMode(CompilationMode.DEBUG)
+        .applyIf(
+            parameters.isCfRuntime(),
+            t ->
+                t.addOptionsModification(
+                    options ->
+                        options.getOpenClosedInterfacesOptions().suppressAllOpenInterfaces()))
+        .apply(
+            b ->
+                b.getBuilder()
+                    .setDisableTreeShaking(true)
+                    .setDisableMinification(true)
+                    .addProguardConfiguration(
+                        ImmutableList.of("-keepattributes *"), Origin.unknown()))
+        .run(
+            parameters.getRuntime(),
+            "twr.twrcloseresource.TwrCloseResourceTest",
+            ANY_REACHABLE_JAR.toAbsolutePath().toString())
+        .assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java b/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java
new file mode 100644
index 0000000..d049990
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/asm/IfaceDump.java
@@ -0,0 +1,904 @@
+// Copyright (c) 2024, 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 twr.twrcloseresource.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class IfaceDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_ABSTRACT | ACC_INTERFACE,
+        "twr/twrcloseresource/Iface",
+        null,
+        "java/lang/Object",
+        null);
+
+    classWriter.visitSource("TwrCloseResourceDuplication$BarDump.java", null);
+
+    {
+      methodVisitor =
+          classWriter.visitMethod(ACC_PUBLIC, "iFoo", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+      Label label4 = new Label();
+      methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+      Label label5 = new Label();
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+      Label label8 = new Label();
+      Label label9 = new Label();
+      Label label10 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label9, label10, "java/lang/Throwable");
+      Label label11 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label9, label11, null);
+      Label label12 = new Label();
+      methodVisitor.visitTryCatchBlock(label10, label12, label11, null);
+      Label label13 = new Label();
+      Label label14 = new Label();
+      Label label15 = new Label();
+      methodVisitor.visitTryCatchBlock(label13, label14, label15, "java/lang/Throwable");
+      Label label16 = new Label();
+      methodVisitor.visitTryCatchBlock(label13, label14, label16, null);
+      Label label17 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label17, label16, null);
+      Label label18 = new Label();
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label18, label19, "java/lang/Exception");
+      Label label20 = new Label();
+      Label label21 = new Label();
+      Label label22 = new Label();
+      methodVisitor.visitTryCatchBlock(label20, label21, label22, "java/lang/Throwable");
+      Label label23 = new Label();
+      methodVisitor.visitTryCatchBlock(label20, label21, label23, null);
+      Label label24 = new Label();
+      methodVisitor.visitTryCatchBlock(label22, label24, label23, null);
+      Label label25 = new Label();
+      Label label26 = new Label();
+      Label label27 = new Label();
+      methodVisitor.visitTryCatchBlock(label25, label26, label27, null);
+      Label label28 = new Label();
+      methodVisitor.visitTryCatchBlock(label27, label28, label27, null);
+      Label label29 = new Label();
+      Label label30 = new Label();
+      methodVisitor.visitTryCatchBlock(label29, label30, label30, "java/lang/Throwable");
+      Label label31 = new Label();
+      Label label32 = new Label();
+      methodVisitor.visitTryCatchBlock(label29, label31, label32, null);
+      Label label33 = new Label();
+      Label label34 = new Label();
+      methodVisitor.visitTryCatchBlock(label33, label34, label34, "java/lang/Exception");
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(82, label5);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label35 = new Label();
+      methodVisitor.visitLabel(label35);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(83, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iA");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(84, label1);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitJumpInsn(GOTO, label6);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(82, label2);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresource/Iface",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(84, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(91, label6);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      Label label36 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label36);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(84, label7);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label37 = new Label();
+      methodVisitor.visitLabel(label37);
+      methodVisitor.visitLineNumber(85, label37);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iB");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label38 = new Label();
+      methodVisitor.visitLabel(label38);
+      methodVisitor.visitLineNumber(86, label38);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      Label label39 = new Label();
+      methodVisitor.visitLabel(label39);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitLineNumber(87, label8);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iC");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(88, label9);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      Label label40 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label40);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(86, label10);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          5,
+          new Object[] {
+            "twr/twrcloseresource/Iface",
+            "java/lang/String",
+            "java/lang/Exception",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitLineNumber(88, label11);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label40);
+      methodVisitor.visitLineNumber(89, label40);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iD");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label41 = new Label();
+      methodVisitor.visitLabel(label41);
+      methodVisitor.visitLineNumber(90, label41);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label36);
+      methodVisitor.visitLineNumber(92, label36);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label42 = new Label();
+      methodVisitor.visitLabel(label42);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitLineNumber(93, label13);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iE");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitLineNumber(94, label14);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitJumpInsn(GOTO, label18);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(92, label15);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresource/Iface",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitLineNumber(94, label16);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(97, label18);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitJumpInsn(GOTO, label33);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitLineNumber(95, label19);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label43 = new Label();
+      methodVisitor.visitLabel(label43);
+      methodVisitor.visitLineNumber(96, label43);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iF");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label33);
+      methodVisitor.visitLineNumber(98, label33);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label44 = new Label();
+      methodVisitor.visitLabel(label44);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLineNumber(99, label29);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iG");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(100, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      Label label45 = new Label();
+      methodVisitor.visitLabel(label45);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitLineNumber(101, label20);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iH");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(102, label21);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitJumpInsn(GOTO, label26);
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(100, label22);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          6,
+          new Object[] {
+            "twr/twrcloseresource/Iface",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitLineNumber(102, label23);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 8);
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 8);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(103, label26);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iI");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label46 = new Label();
+      methodVisitor.visitLabel(label46);
+      methodVisitor.visitLineNumber(104, label46);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitLineNumber(103, label27);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 9);
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iI");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label47 = new Label();
+      methodVisitor.visitLabel(label47);
+      methodVisitor.visitLineNumber(104, label47);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label30);
+      methodVisitor.visitLineNumber(98, label30);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label32);
+      methodVisitor.visitLineNumber(106, label32);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 10);
+      methodVisitor.visitLabel(label31);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 10);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label34);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {"twr/twrcloseresource/Iface", "java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label48 = new Label();
+      methodVisitor.visitLabel(label48);
+      methodVisitor.visitLineNumber(107, label48);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iJ");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label49 = new Label();
+      methodVisitor.visitLabel(label49);
+      methodVisitor.visitLineNumber(109, label49);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("iK");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label50 = new Label();
+      methodVisitor.visitLabel(label50);
+      methodVisitor.visitLineNumber(110, label50);
+      methodVisitor.visitInsn(RETURN);
+      Label label51 = new Label();
+      methodVisitor.visitLabel(label51);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label35, label6, 2);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label39, label40, 3);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label37, label36, 2);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label42, label18, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label43, label33, 2);
+      methodVisitor.visitLocalVariable("b", "Ljava/util/jar/JarFile;", null, label45, label26, 4);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label44, label34, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label48, label49, 2);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwrcloseresource/Iface;", null, label5, label51, 0);
+      methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label5, label51, 1);
+      methodVisitor.visitMaxs(3, 11);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PUBLIC | ACC_STATIC, "iBar", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label1, "java/lang/Throwable");
+      Label label2 = new Label();
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label2, label3, null);
+      Label label4 = new Label();
+      Label label5 = new Label();
+      methodVisitor.visitTryCatchBlock(label4, label5, label5, "java/lang/Exception");
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label6, label7, label7, "java/lang/Throwable");
+      Label label8 = new Label();
+      Label label9 = new Label();
+      methodVisitor.visitTryCatchBlock(label6, label8, label9, null);
+      Label label10 = new Label();
+      Label label11 = new Label();
+      methodVisitor.visitTryCatchBlock(label10, label11, label11, "java/lang/Exception");
+      Label label12 = new Label();
+      Label label13 = new Label();
+      methodVisitor.visitTryCatchBlock(label12, label13, label13, "java/lang/Throwable");
+      Label label14 = new Label();
+      Label label15 = new Label();
+      methodVisitor.visitTryCatchBlock(label12, label14, label15, null);
+      Label label16 = new Label();
+      Label label17 = new Label();
+      methodVisitor.visitTryCatchBlock(label16, label17, label17, "java/lang/Exception");
+      Label label18 = new Label();
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label19, label19, "java/lang/Throwable");
+      Label label20 = new Label();
+      Label label21 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label20, label21, null);
+      Label label22 = new Label();
+      Label label23 = new Label();
+      methodVisitor.visitTryCatchBlock(label22, label23, label23, "java/lang/Exception");
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitLineNumber(113, label4);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label24 = new Label();
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(114, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label25 = new Label();
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(115, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(113, label1);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(116, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label26 = new Label();
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(117, label26);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(119, label10);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label27 = new Label();
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(120, label6);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i3");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label28 = new Label();
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitLineNumber(121, label28);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(119, label7);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(122, label9);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label29 = new Label();
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLineNumber(123, label29);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i4");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitLineNumber(125, label16);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label30 = new Label();
+      methodVisitor.visitLabel(label30);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitLineNumber(126, label12);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i5");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label31 = new Label();
+      methodVisitor.visitLabel(label31);
+      methodVisitor.visitLineNumber(127, label31);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitLineNumber(125, label13);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(128, label15);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label32 = new Label();
+      methodVisitor.visitLabel(label32);
+      methodVisitor.visitLineNumber(129, label32);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i6");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(131, label22);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label33 = new Label();
+      methodVisitor.visitLabel(label33);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(132, label18);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i7");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label34 = new Label();
+      methodVisitor.visitLabel(label34);
+      methodVisitor.visitLineNumber(133, label34);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitLineNumber(131, label19);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(134, label21);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/Iface",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          true);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label35 = new Label();
+      methodVisitor.visitLabel(label35);
+      methodVisitor.visitLineNumber(135, label35);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i8");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label36 = new Label();
+      methodVisitor.visitLabel(label36);
+      methodVisitor.visitLineNumber(137, label36);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("i99");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label37 = new Label();
+      methodVisitor.visitLabel(label37);
+      methodVisitor.visitLineNumber(138, label37);
+      methodVisitor.visitInsn(RETURN);
+      Label label38 = new Label();
+      methodVisitor.visitLabel(label38);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label24, label5, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label10, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label27, label11, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label29, label16, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label30, label17, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label32, label22, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label33, label23, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label35, label36, 1);
+      methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label4, label38, 0);
+      methodVisitor.visitMaxs(3, 8);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+              "$closeResource",
+              "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+              null,
+              null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(84, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      Label label4 = new Label();
+      methodVisitor.visitJumpInsn(IFNULL, label4);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label1);
+      Label label5 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+      methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+      methodVisitor.visitMaxs(2, 3);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java b/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java
new file mode 100644
index 0000000..cdf4cba
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresource/asm/TwrCloseResourceTestDump.java
@@ -0,0 +1,1042 @@
+// Copyright (c) 2024, 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.
+
+/**
+ * Dump of class file for twr.twrcloseresource.TwrCloseResourceTest
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twrcloseresource;
+ *
+ * <p>import java.util.jar.JarFile;
+ *
+ * <p>public class TwrCloseResourceTest implements Iface { public static void main(String[] args) {
+ * TwrCloseResourceTest o = new TwrCloseResourceTest(); o.foo(args[0]); o.iFoo(args[0]);
+ * bar(args[0]); Iface.iBar(args[0]); }
+ *
+ * <p>synchronized void foo(String arg) { try { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("A"); } catch (Exception e) { System.out.println("B"); try (JarFile a = new
+ * JarFile(arg)) { System.out.println("C"); } System.out.println("D"); throw new RuntimeException();
+ * } try (JarFile a = new JarFile(arg)) { System.out.println("E"); } } catch (Exception e) {
+ * System.out.println("F"); } try (JarFile a = new JarFile(arg)) { System.out.println("G"); try
+ * (JarFile b = new JarFile(arg)) { System.out.println("H"); } finally { System.out.println("I");
+ * throw new RuntimeException(); } } catch (Exception e) { System.out.println("J"); }
+ * System.out.println("K"); }
+ *
+ * <p>static synchronized void bar(String arg) { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("1"); throw new RuntimeException(); } catch (Exception e) {
+ * System.out.println("2"); } try (JarFile a = new JarFile(arg)) { System.out.println("3"); throw
+ * new RuntimeException(); } catch (Exception e) { System.out.println("4"); } try (JarFile a = new
+ * JarFile(arg)) { System.out.println("5"); throw new RuntimeException(); } catch (Exception e) {
+ * System.out.println("6"); } try (JarFile a = new JarFile(arg)) { System.out.println("7"); throw
+ * new RuntimeException(); } catch (Exception e) { System.out.println("8"); }
+ * System.out.println("99"); } }
+ *
+ * <p>interface Iface { default void iFoo(String arg) { try { try (JarFile a = new JarFile(arg)) {
+ * System.out.println("iA"); } catch (Exception e) { System.out.println("iB"); try (JarFile a = new
+ * JarFile(arg)) { System.out.println("iC"); } System.out.println("iD"); throw new
+ * RuntimeException(); } try (JarFile a = new JarFile(arg)) { System.out.println("iE"); } } catch
+ * (Exception e) { System.out.println("iF"); } try (JarFile a = new JarFile(arg)) {
+ * System.out.println("iG"); try (JarFile b = new JarFile(arg)) { System.out.println("iH"); }
+ * finally { System.out.println("iI"); throw new RuntimeException(); } } catch (Exception e) {
+ * System.out.println("iJ"); } System.out.println("iK"); }
+ *
+ * <p>static void iBar(String arg) { try (JarFile a = new JarFile(arg)) { System.out.println("i1");
+ * throw new RuntimeException(); } catch (Exception e) { System.out.println("i2"); } try (JarFile a
+ * = new JarFile(arg)) { System.out.println("i3"); throw new RuntimeException(); } catch (Exception
+ * e) { System.out.println("i4"); } try (JarFile a = new JarFile(arg)) { System.out.println("i5");
+ * throw new RuntimeException(); } catch (Exception e) { System.out.println("i6"); } try (JarFile a
+ * = new JarFile(arg)) { System.out.println("i7"); throw new RuntimeException(); } catch (Exception
+ * e) { System.out.println("i8"); } System.out.println("i99"); } }
+ */
+package twr.twrcloseresource.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceTestDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twrcloseresource/TwrCloseResourceTest",
+        null,
+        "java/lang/Object",
+        new String[] {"twr/twrcloseresource/Iface"});
+
+    classWriter.visitSource("TwrCloseResourceDuplication$BarDump.java", null);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(9, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwrcloseresource/TwrCloseResourceTest;", null, label0, label1, 0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(11, label0);
+      methodVisitor.visitTypeInsn(NEW, "twr/twrcloseresource/TwrCloseResourceTest");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "twr/twrcloseresource/TwrCloseResourceTest", "<init>", "()V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(12, label1);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "foo",
+          "(Ljava/lang/String;)V",
+          false);
+      Label label2 = new Label();
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(13, label2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "iFoo",
+          "(Ljava/lang/String;)V",
+          false);
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(14, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "bar",
+          "(Ljava/lang/String;)V",
+          false);
+      Label label4 = new Label();
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitLineNumber(15, label4);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC, "twr/twrcloseresource/Iface", "iBar", "(Ljava/lang/String;)V", true);
+      Label label5 = new Label();
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(16, label5);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label6, 0);
+      methodVisitor.visitLocalVariable(
+          "o", "Ltwrcloseresource/TwrCloseResourceTest;", null, label1, label6, 1);
+      methodVisitor.visitMaxs(3, 2);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(ACC_SYNCHRONIZED, "foo", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+      Label label4 = new Label();
+      methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+      Label label5 = new Label();
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+      Label label8 = new Label();
+      Label label9 = new Label();
+      Label label10 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label9, label10, "java/lang/Throwable");
+      Label label11 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label9, label11, null);
+      Label label12 = new Label();
+      methodVisitor.visitTryCatchBlock(label10, label12, label11, null);
+      Label label13 = new Label();
+      Label label14 = new Label();
+      Label label15 = new Label();
+      methodVisitor.visitTryCatchBlock(label13, label14, label15, "java/lang/Throwable");
+      Label label16 = new Label();
+      methodVisitor.visitTryCatchBlock(label13, label14, label16, null);
+      Label label17 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label17, label16, null);
+      Label label18 = new Label();
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label18, label19, "java/lang/Exception");
+      Label label20 = new Label();
+      Label label21 = new Label();
+      Label label22 = new Label();
+      methodVisitor.visitTryCatchBlock(label20, label21, label22, "java/lang/Throwable");
+      Label label23 = new Label();
+      methodVisitor.visitTryCatchBlock(label20, label21, label23, null);
+      Label label24 = new Label();
+      methodVisitor.visitTryCatchBlock(label22, label24, label23, null);
+      Label label25 = new Label();
+      Label label26 = new Label();
+      Label label27 = new Label();
+      methodVisitor.visitTryCatchBlock(label25, label26, label27, null);
+      Label label28 = new Label();
+      methodVisitor.visitTryCatchBlock(label27, label28, label27, null);
+      Label label29 = new Label();
+      Label label30 = new Label();
+      methodVisitor.visitTryCatchBlock(label29, label30, label30, "java/lang/Throwable");
+      Label label31 = new Label();
+      Label label32 = new Label();
+      methodVisitor.visitTryCatchBlock(label29, label31, label32, null);
+      Label label33 = new Label();
+      Label label34 = new Label();
+      methodVisitor.visitTryCatchBlock(label33, label34, label34, "java/lang/Exception");
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(20, label5);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label35 = new Label();
+      methodVisitor.visitLabel(label35);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(21, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("A");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(22, label1);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitJumpInsn(GOTO, label6);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(20, label2);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresource/TwrCloseResourceTest",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(22, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(29, label6);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      Label label36 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label36);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(22, label7);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label37 = new Label();
+      methodVisitor.visitLabel(label37);
+      methodVisitor.visitLineNumber(23, label37);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("B");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label38 = new Label();
+      methodVisitor.visitLabel(label38);
+      methodVisitor.visitLineNumber(24, label38);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      Label label39 = new Label();
+      methodVisitor.visitLabel(label39);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitLineNumber(25, label8);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("C");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(26, label9);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      Label label40 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label40);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(24, label10);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          5,
+          new Object[] {
+            "twr/twrcloseresource/TwrCloseResourceTest",
+            "java/lang/String",
+            "java/lang/Exception",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitLineNumber(26, label11);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label40);
+      methodVisitor.visitLineNumber(27, label40);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("D");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label41 = new Label();
+      methodVisitor.visitLabel(label41);
+      methodVisitor.visitLineNumber(28, label41);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label36);
+      methodVisitor.visitLineNumber(30, label36);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 1, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label42 = new Label();
+      methodVisitor.visitLabel(label42);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitLineNumber(31, label13);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("E");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitLineNumber(32, label14);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitJumpInsn(GOTO, label18);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(30, label15);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresource/TwrCloseResourceTest",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitLineNumber(32, label16);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(35, label18);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitJumpInsn(GOTO, label33);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitLineNumber(33, label19);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label43 = new Label();
+      methodVisitor.visitLabel(label43);
+      methodVisitor.visitLineNumber(34, label43);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("F");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label33);
+      methodVisitor.visitLineNumber(36, label33);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label44 = new Label();
+      methodVisitor.visitLabel(label44);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLineNumber(37, label29);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("G");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(38, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      Label label45 = new Label();
+      methodVisitor.visitLabel(label45);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitLineNumber(39, label20);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("H");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(40, label21);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitJumpInsn(GOTO, label26);
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(38, label22);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          6,
+          new Object[] {
+            "twr/twrcloseresource/TwrCloseResourceTest",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitLineNumber(40, label23);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 8);
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 8);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(41, label26);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("I");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label46 = new Label();
+      methodVisitor.visitLabel(label46);
+      methodVisitor.visitLineNumber(42, label46);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitLineNumber(41, label27);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 9);
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("I");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label47 = new Label();
+      methodVisitor.visitLabel(label47);
+      methodVisitor.visitLineNumber(42, label47);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label30);
+      methodVisitor.visitLineNumber(36, label30);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label32);
+      methodVisitor.visitLineNumber(44, label32);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 10);
+      methodVisitor.visitLabel(label31);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 10);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label34);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {"twr/twrcloseresource/TwrCloseResourceTest", "java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label48 = new Label();
+      methodVisitor.visitLabel(label48);
+      methodVisitor.visitLineNumber(45, label48);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("J");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label49 = new Label();
+      methodVisitor.visitLabel(label49);
+      methodVisitor.visitLineNumber(47, label49);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("K");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label50 = new Label();
+      methodVisitor.visitLabel(label50);
+      methodVisitor.visitLineNumber(48, label50);
+      methodVisitor.visitInsn(RETURN);
+      Label label51 = new Label();
+      methodVisitor.visitLabel(label51);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label35, label6, 2);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label39, label40, 3);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label37, label36, 2);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label42, label18, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label43, label33, 2);
+      methodVisitor.visitLocalVariable("b", "Ljava/util/jar/JarFile;", null, label45, label26, 4);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label44, label34, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label48, label49, 2);
+      methodVisitor.visitLocalVariable(
+          "this", "Ltwrcloseresource/TwrCloseResourceTest;", null, label5, label51, 0);
+      methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label5, label51, 1);
+      methodVisitor.visitMaxs(3, 11);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_STATIC | ACC_SYNCHRONIZED, "bar", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label1, "java/lang/Throwable");
+      Label label2 = new Label();
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label2, label3, null);
+      Label label4 = new Label();
+      Label label5 = new Label();
+      methodVisitor.visitTryCatchBlock(label4, label5, label5, "java/lang/Exception");
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label6, label7, label7, "java/lang/Throwable");
+      Label label8 = new Label();
+      Label label9 = new Label();
+      methodVisitor.visitTryCatchBlock(label6, label8, label9, null);
+      Label label10 = new Label();
+      Label label11 = new Label();
+      methodVisitor.visitTryCatchBlock(label10, label11, label11, "java/lang/Exception");
+      Label label12 = new Label();
+      Label label13 = new Label();
+      methodVisitor.visitTryCatchBlock(label12, label13, label13, "java/lang/Throwable");
+      Label label14 = new Label();
+      Label label15 = new Label();
+      methodVisitor.visitTryCatchBlock(label12, label14, label15, null);
+      Label label16 = new Label();
+      Label label17 = new Label();
+      methodVisitor.visitTryCatchBlock(label16, label17, label17, "java/lang/Exception");
+      Label label18 = new Label();
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label19, label19, "java/lang/Throwable");
+      Label label20 = new Label();
+      Label label21 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label20, label21, null);
+      Label label22 = new Label();
+      Label label23 = new Label();
+      methodVisitor.visitTryCatchBlock(label22, label23, label23, "java/lang/Exception");
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitLineNumber(51, label4);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label24 = new Label();
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(52, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label25 = new Label();
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(53, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(51, label1);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(54, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label26 = new Label();
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(55, label26);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitLineNumber(57, label10);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label27 = new Label();
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(58, label6);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("3");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label28 = new Label();
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitLineNumber(59, label28);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(57, label7);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(60, label9);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label29 = new Label();
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLineNumber(61, label29);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("4");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitLineNumber(63, label16);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label30 = new Label();
+      methodVisitor.visitLabel(label30);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitLineNumber(64, label12);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("5");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label31 = new Label();
+      methodVisitor.visitLabel(label31);
+      methodVisitor.visitLineNumber(65, label31);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitLineNumber(63, label13);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(66, label15);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label32 = new Label();
+      methodVisitor.visitLabel(label32);
+      methodVisitor.visitLineNumber(67, label32);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("6");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(69, label22);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label33 = new Label();
+      methodVisitor.visitLabel(label33);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(70, label18);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("7");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label34 = new Label();
+      methodVisitor.visitLabel(label34);
+      methodVisitor.visitLineNumber(71, label34);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitLineNumber(69, label19);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          3,
+          new Object[] {"java/lang/String", "java/util/jar/JarFile", "java/lang/Throwable"},
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(72, label21);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresource/TwrCloseResourceTest",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          1,
+          new Object[] {"java/lang/String"},
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 1);
+      Label label35 = new Label();
+      methodVisitor.visitLabel(label35);
+      methodVisitor.visitLineNumber(73, label35);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("8");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label36 = new Label();
+      methodVisitor.visitLabel(label36);
+      methodVisitor.visitLineNumber(75, label36);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("99");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label37 = new Label();
+      methodVisitor.visitLabel(label37);
+      methodVisitor.visitLineNumber(76, label37);
+      methodVisitor.visitInsn(RETURN);
+      Label label38 = new Label();
+      methodVisitor.visitLabel(label38);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label24, label5, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label10, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label27, label11, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label29, label16, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label30, label17, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label32, label22, 1);
+      methodVisitor.visitLocalVariable("a", "Ljava/util/jar/JarFile;", null, label33, label23, 1);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label35, label36, 1);
+      methodVisitor.visitLocalVariable("arg", "Ljava/lang/String;", null, label4, label38, 0);
+      methodVisitor.visitMaxs(3, 8);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+              "$closeResource",
+              "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+              null,
+              null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(22, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      Label label4 = new Label();
+      methodVisitor.visitJumpInsn(IFNULL, label4);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label1);
+      Label label5 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+      methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+      methodVisitor.visitMaxs(2, 3);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
similarity index 84%
rename from src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
rename to src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
index 3bb5e4c..4cad84a 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
@@ -2,7 +2,7 @@
 // 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.profile.art.completeness;
+package twr.twrcloseresourceduplication;
 
 import static com.android.tools.r8.desugar.LibraryFilesHelper.getJdk11LibraryFiles;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -12,8 +12,6 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.twr.TwrCloseResourceDuplicationTest;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
 import com.android.tools.r8.profile.art.model.ExternalArtProfile;
 import com.android.tools.r8.profile.art.utils.ArtProfileInspector;
 import com.android.tools.r8.references.Reference;
@@ -37,7 +35,7 @@
   @Test
   public void testD8ProfileRewriting() throws Exception {
     testForD8(parameters.getBackend())
-        .addProgramFiles(TwrCloseResourceDuplicationTest.getProgramInputs())
+        .addProgramClassFileData(TwrCloseResourceDuplicationTest.getProgramInputs())
         .addArtProfileForRewriting(getArtProfile())
         .addOptionsModification(options -> options.testing.enableSyntheticSharing = false)
         .applyIf(
@@ -52,7 +50,7 @@
         .setMinApi(parameters)
         .compile()
         .inspectResidualArtProfile(this::inspectD8)
-        .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+        .run(parameters.getRuntime(), MAIN, getZipFile())
         .assertSuccessWithOutput(TwrCloseResourceDuplicationTest.EXPECTED);
   }
 
@@ -60,9 +58,9 @@
   public void testR8ProfileRewriting() throws Exception {
     parameters.assumeR8TestParameters();
     testForR8(parameters.getBackend())
-        .addProgramFiles(TwrCloseResourceDuplicationTest.getProgramInputs())
-        .addKeepMainRule(MAIN.typeName())
-        .addKeepClassAndMembersRules(FOO.typeName(), BAR.typeName())
+        .addProgramClassFileData(TwrCloseResourceDuplicationTest.getProgramInputs())
+        .addKeepMainRule(MAIN)
+        .addKeepClassAndMembersRules(FOO, BAR)
         .addArtProfileForRewriting(getArtProfile())
         .addOptionsModification(InlinerOptions::disableInlining)
         .addOptionsModification(options -> options.testing.enableSyntheticSharing = false)
@@ -81,7 +79,7 @@
         .setMinApi(parameters)
         .compile()
         .inspectResidualArtProfile(this::inspectR8)
-        .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+        .run(parameters.getRuntime(), MAIN, getZipFile())
         .assertSuccessWithOutput(TwrCloseResourceDuplicationTest.EXPECTED);
   }
 
@@ -93,24 +91,30 @@
     return ExternalArtProfile.builder()
         .addMethodRule(
             Reference.method(
-                FOO.getClassReference(),
+                Reference.classFromTypeName(FOO),
                 "foo",
                 ImmutableList.of(Reference.classFromClass(String.class)),
                 null))
         .addMethodRule(
             // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
             Reference.method(
-                FOO.getClassReference(), "$closeResource", closeResourceFormalParameters, null))
+                Reference.classFromTypeName(FOO),
+                "$closeResource",
+                closeResourceFormalParameters,
+                null))
         .addMethodRule(
             Reference.method(
-                BAR.getClassReference(),
+                Reference.classFromTypeName(BAR),
                 "bar",
                 ImmutableList.of(Reference.classFromClass(String.class)),
                 null))
         .addMethodRule(
             // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
             Reference.method(
-                BAR.getClassReference(), "$closeResource", closeResourceFormalParameters, null))
+                Reference.classFromTypeName(BAR),
+                "$closeResource",
+                closeResourceFormalParameters,
+                null))
         .build();
   }
 
@@ -137,10 +141,10 @@
         .allClasses()
         .forEach(c -> System.out.println(c.getDexProgramClass().toSourceString()));
     assertEquals(expectedClassCount, inspector.allClasses().size());
-    assertThat(inspector.clazz(MAIN.typeName()), isPresent());
+    assertThat(inspector.clazz(MAIN), isPresent());
 
     // Class Foo has two methods foo() and $closeResource().
-    ClassSubject fooClassSubject = inspector.clazz(FOO.typeName());
+    ClassSubject fooClassSubject = inspector.clazz(FOO);
     assertThat(fooClassSubject, isPresent());
 
     MethodSubject fooMethodSubject = fooClassSubject.uniqueMethodWithOriginalName("foo");
@@ -151,7 +155,7 @@
     assertThat(fooCloseResourceMethodSubject, isPresent());
 
     // Class Bar has two methods bar() and $closeResource().
-    ClassSubject barClassSubject = inspector.clazz(BAR.typeName());
+    ClassSubject barClassSubject = inspector.clazz(BAR);
     assertThat(barClassSubject, isPresent());
 
     MethodSubject barMethodSubject = barClassSubject.uniqueMethodWithOriginalName("bar");
@@ -170,15 +174,17 @@
             barCloseResourceMethodSubject);
 
     // There is 1 backport, 2 synthetic API outlines, and 3 twr classes for both Foo and Bar.
-    for (JavaExampleClassProxy clazz : ImmutableList.of(FOO, BAR)) {
+    for (String clazz : ImmutableList.of(FOO, BAR)) {
       ClassSubject syntheticApiOutlineClassSubject0 =
           inspector.clazz(
-              SyntheticItemsTestUtils.syntheticApiOutlineClass(clazz.getClassReference(), 0));
+              SyntheticItemsTestUtils.syntheticApiOutlineClass(
+                  Reference.classFromTypeName(clazz), 0));
       assertThat(syntheticApiOutlineClassSubject0, isPresentIf(hasTwrCloseResourceApiOutlines()));
 
       ClassSubject syntheticApiOutlineClassSubject1 =
           inspector.clazz(
-              SyntheticItemsTestUtils.syntheticApiOutlineClass(clazz.getClassReference(), 1));
+              SyntheticItemsTestUtils.syntheticApiOutlineClass(
+                  Reference.classFromTypeName(clazz), 1));
       assertThat(syntheticApiOutlineClassSubject1, isPresentIf(hasTwrCloseResourceApiOutlines()));
 
       int initialSyntheticId = hasTwrCloseResourceApiOutlines() ? 2 : 0;
@@ -186,27 +192,27 @@
       ClassSubject syntheticBackportClassSubject =
           inspector.clazz(
               SyntheticItemsTestUtils.syntheticBackportClass(
-                  clazz.getClassReference(), initialSyntheticId));
+                  Reference.classFromTypeName(clazz), initialSyntheticId));
       assertThat(syntheticBackportClassSubject, notIf(isPresent(), hasTwrCloseResourceSupport));
 
       ClassSubject syntheticTwrCloseResourceClassSubject3 =
           inspector.clazz(
               SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
-                  clazz.getClassReference(), initialSyntheticId + 1));
+                  Reference.classFromTypeName(clazz), initialSyntheticId + 1));
       assertThat(
           syntheticTwrCloseResourceClassSubject3, notIf(isPresent(), hasTwrCloseResourceSupport));
 
       ClassSubject syntheticTwrCloseResourceClassSubject4 =
           inspector.clazz(
               SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
-                  clazz.getClassReference(), initialSyntheticId + 2));
+                  Reference.classFromTypeName(clazz), initialSyntheticId + 2));
       assertThat(
           syntheticTwrCloseResourceClassSubject4, notIf(isPresent(), hasTwrCloseResourceSupport));
 
       ClassSubject syntheticTwrCloseResourceClassSubject5 =
           inspector.clazz(
               SyntheticItemsTestUtils.syntheticTwrCloseResourceClass(
-                  clazz.getClassReference(), initialSyntheticId + 3));
+                  Reference.classFromTypeName(clazz), initialSyntheticId + 3));
       assertThat(
           syntheticTwrCloseResourceClassSubject5, notIf(isPresent(), hasTwrCloseResourceSupport));
 
diff --git a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
similarity index 78%
rename from src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java
rename to src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
index dbea1507..930ae37 100644
--- a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
@@ -1,7 +1,7 @@
 // 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.desugar.twr;
+package twr.twrcloseresourceduplication;
 
 import static org.junit.Assert.assertEquals;
 
@@ -10,7 +10,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.examples.JavaExampleClassProxy;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import java.io.IOException;
-import java.nio.file.Path;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -29,18 +28,19 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplication$BarDump;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplication$FooDump;
+import twr.twrcloseresourceduplication.asm.TwrCloseResourceDuplicationDump;
 
 @RunWith(Parameterized.class)
 public class TwrCloseResourceDuplicationTest extends TestBase {
 
-  private static final String PKG = "twrcloseresourceduplication";
-  private static final String EXAMPLE = "examplesJava9/" + PKG;
-  protected static final JavaExampleClassProxy MAIN =
-      new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication");
-  protected static final JavaExampleClassProxy FOO =
-      new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Foo");
-  protected static final JavaExampleClassProxy BAR =
-      new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Bar");
+  protected static final String MAIN =
+      "twr.twrcloseresourceduplication.TwrCloseResourceDuplication";
+  protected static final String FOO =
+      "twr.twrcloseresourceduplication.TwrCloseResourceDuplication$Foo";
+  protected static final String BAR =
+      "twr.twrcloseresourceduplication.TwrCloseResourceDuplication$Bar";
 
   static final int INPUT_CLASSES = 3;
 
@@ -87,26 +87,29 @@
         .toString();
   }
 
-  protected static List<Path> getProgramInputs() {
-    return ImmutableList.of(JavaExampleClassProxy.examplesJar(EXAMPLE));
+  protected static List<byte[]> getProgramInputs() throws Exception {
+    return ImmutableList.of(
+        TwrCloseResourceDuplicationDump.dump(),
+        TwrCloseResourceDuplication$FooDump.dump(),
+        TwrCloseResourceDuplication$BarDump.dump());
   }
 
   @Test
   public void testJvm() throws Exception {
     parameters.assumeJvmTestParameters();
     testForJvm(parameters)
-        .addProgramFiles(getProgramInputs())
-        .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+        .addProgramClassFileData(getProgramInputs())
+        .run(parameters.getRuntime(), MAIN, getZipFile())
         .assertSuccessWithOutput(EXPECTED);
   }
 
   @Test
   public void testD8() throws Exception {
     testForD8(parameters.getBackend())
-        .addProgramFiles(getProgramInputs())
+        .addProgramClassFileData(getProgramInputs())
         .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
         .setMinApi(parameters)
-        .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+        .run(parameters.getRuntime(), MAIN, getZipFile())
         .assertSuccessWithOutput(EXPECTED)
         .inspect(
             inspector -> {
@@ -132,13 +135,13 @@
   public void testR8() throws Exception {
     parameters.assumeDexRuntime();
     testForR8(parameters.getBackend())
-        .addProgramFiles(getProgramInputs())
+        .addProgramClassFileData(getProgramInputs())
         .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.LATEST))
-        .addKeepMainRule(MAIN.typeName())
-        .addKeepClassAndMembersRules(FOO.typeName(), BAR.typeName())
+        .addKeepMainRule(MAIN)
+        .addKeepClassAndMembersRules(FOO, BAR)
         .setMinApi(parameters)
         .addDontObfuscate()
-        .run(parameters.getRuntime(), MAIN.typeName(), getZipFile())
+        .run(parameters.getRuntime(), MAIN, getZipFile())
         .assertSuccessWithOutput(EXPECTED)
         .inspect(
             inspector -> {
@@ -149,12 +152,12 @@
                       .collect(Collectors.toSet());
               // R8 will optimize the generated methods for the two cases below where the thrown
               // exception is known or not, thus the synthetic methods will be 2.
-              Set<String> nonSyntheticClassOutput =
-                  ImmutableSet.of(FOO.typeName(), BAR.typeName(), MAIN.typeName());
+              Set<String> nonSyntheticClassOutput = ImmutableSet.of(FOO, BAR, MAIN);
               if (!hasTwrCloseResourceSupport(parameters.isDexRuntime())) {
                 Set<String> classOutputWithSynthetics = new HashSet<>(nonSyntheticClassOutput);
                 classOutputWithSynthetics.add(
-                    SyntheticItemsTestUtils.syntheticApiOutlineClass(BAR.getClassReference(), 0)
+                    SyntheticItemsTestUtils.syntheticApiOutlineClass(
+                            Reference.classFromTypeName(BAR), 0)
                         .getTypeName());
                 assertEquals(classOutputWithSynthetics, foundClasses);
               } else {
@@ -162,5 +165,4 @@
               }
             });
   }
-
 }
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java
new file mode 100644
index 0000000..de20665
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$BarDump.java
@@ -0,0 +1,410 @@
+// Copyright (c) 2024, 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 twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplication$BarDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+        null,
+        "java/lang/Object",
+        null);
+
+    classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+    classWriter.visitInnerClass(
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+        "Bar",
+        ACC_PUBLIC | ACC_STATIC);
+
+    classWriter.visitInnerClass(
+        "java/lang/invoke/MethodHandles$Lookup",
+        "java/lang/invoke/MethodHandles",
+        "Lookup",
+        ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(31, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this",
+          "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;",
+          null,
+          label0,
+          label1,
+          0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor = classWriter.visitMethod(0, "bar", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+      Label label4 = new Label();
+      methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+      Label label5 = new Label();
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+      Label label8 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+      Label label9 = new Label();
+      methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+      Label label10 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label10, label8, null);
+      Label label11 = new Label();
+      Label label12 = new Label();
+      methodVisitor.visitTryCatchBlock(label11, label12, label12, "java/lang/Throwable");
+      Label label13 = new Label();
+      Label label14 = new Label();
+      methodVisitor.visitTryCatchBlock(label11, label13, label14, null);
+      Label label15 = new Label();
+      Label label16 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label16, label16, "java/lang/Exception");
+      Label label17 = new Label();
+      Label label18 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label17, label18, null);
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label19, label18, null);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(34, label5);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label20 = new Label();
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(35, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar opened 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(36, label1);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitJumpInsn(GOTO, label6);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(34, label2);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(36, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(39, label6);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label21 = new Label();
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(40, label21);
+      methodVisitor.visitJumpInsn(GOTO, label15);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(36, label7);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label22 = new Label();
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(37, label22);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+      methodVisitor.visitInvokeDynamicInsn(
+          "makeConcatWithConstants",
+          "(Ljava/lang/String;)Ljava/lang/String;",
+          new Handle(
+              Opcodes.H_INVOKESTATIC,
+              "java/lang/invoke/StringConcatFactory",
+              "makeConcatWithConstants",
+              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+              false),
+          new Object[] {"bar caught from 1: \u0001"});
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(39, label9);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label23 = new Label();
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitLineNumber(40, label23);
+      methodVisitor.visitJumpInsn(GOTO, label15);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitLineNumber(39, label8);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(41, label15);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label24 = new Label();
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitLineNumber(42, label11);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar opened 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label25 = new Label();
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(43, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitLineNumber(41, label12);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitLineNumber(44, label14);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar", "java/lang/String"
+          },
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label26 = new Label();
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(45, label26);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+      methodVisitor.visitInvokeDynamicInsn(
+          "makeConcatWithConstants",
+          "(Ljava/lang/String;)Ljava/lang/String;",
+          new Handle(
+              Opcodes.H_INVOKESTATIC,
+              "java/lang/invoke/StringConcatFactory",
+              "makeConcatWithConstants",
+              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+              false),
+          new Object[] {"bar caught from 2: \u0001"});
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitLineNumber(47, label17);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar post close 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label27 = new Label();
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitLineNumber(48, label27);
+      Label label28 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label28);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(47, label18);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 8);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("bar post close 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ALOAD, 8);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitLineNumber(49, label28);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label29 = new Label();
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label20, label6, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label22, label9, 2);
+      methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label24, label16, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label17, 2);
+      methodVisitor.visitLocalVariable(
+          "this",
+          "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Bar;",
+          null,
+          label5,
+          label29,
+          0);
+      methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label5, label29, 1);
+      methodVisitor.visitMaxs(3, 9);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+              "$closeResource",
+              "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+              null,
+              null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(36, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      Label label4 = new Label();
+      methodVisitor.visitJumpInsn(IFNULL, label4);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label1);
+      Label label5 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+      methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+      methodVisitor.visitMaxs(2, 3);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java
new file mode 100644
index 0000000..68f63a3
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplication$FooDump.java
@@ -0,0 +1,410 @@
+// Copyright (c) 2024, 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 twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplication$FooDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+        null,
+        "java/lang/Object",
+        null);
+
+    classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+    classWriter.visitInnerClass(
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+        "Foo",
+        ACC_PUBLIC | ACC_STATIC);
+
+    classWriter.visitInnerClass(
+        "java/lang/invoke/MethodHandles$Lookup",
+        "java/lang/invoke/MethodHandles",
+        "Lookup",
+        ACC_PUBLIC | ACC_FINAL | ACC_STATIC);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(10, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this",
+          "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Foo;",
+          null,
+          label0,
+          label1,
+          0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor = classWriter.visitMethod(0, "foo", "(Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label3, null);
+      Label label4 = new Label();
+      methodVisitor.visitTryCatchBlock(label2, label4, label3, null);
+      Label label5 = new Label();
+      Label label6 = new Label();
+      Label label7 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label7, "java/lang/Exception");
+      Label label8 = new Label();
+      methodVisitor.visitTryCatchBlock(label5, label6, label8, null);
+      Label label9 = new Label();
+      methodVisitor.visitTryCatchBlock(label7, label9, label8, null);
+      Label label10 = new Label();
+      methodVisitor.visitTryCatchBlock(label8, label10, label8, null);
+      Label label11 = new Label();
+      Label label12 = new Label();
+      methodVisitor.visitTryCatchBlock(label11, label12, label12, "java/lang/Throwable");
+      Label label13 = new Label();
+      Label label14 = new Label();
+      methodVisitor.visitTryCatchBlock(label11, label13, label14, null);
+      Label label15 = new Label();
+      Label label16 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label16, label16, "java/lang/Exception");
+      Label label17 = new Label();
+      Label label18 = new Label();
+      methodVisitor.visitTryCatchBlock(label15, label17, label18, null);
+      Label label19 = new Label();
+      methodVisitor.visitTryCatchBlock(label18, label19, label18, null);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitLineNumber(13, label5);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label20 = new Label();
+      methodVisitor.visitLabel(label20);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(14, label0);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo opened 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(15, label1);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitJumpInsn(GOTO, label6);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(13, label2);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(15, label3);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 5);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLineNumber(18, label6);
+      methodVisitor.visitFrame(Opcodes.F_CHOP, 2, null, 0, null);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label21 = new Label();
+      methodVisitor.visitLabel(label21);
+      methodVisitor.visitLineNumber(19, label21);
+      methodVisitor.visitJumpInsn(GOTO, label15);
+      methodVisitor.visitLabel(label7);
+      methodVisitor.visitLineNumber(15, label7);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label22 = new Label();
+      methodVisitor.visitLabel(label22);
+      methodVisitor.visitLineNumber(16, label22);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+      methodVisitor.visitInvokeDynamicInsn(
+          "makeConcatWithConstants",
+          "(Ljava/lang/String;)Ljava/lang/String;",
+          new Handle(
+              Opcodes.H_INVOKESTATIC,
+              "java/lang/invoke/StringConcatFactory",
+              "makeConcatWithConstants",
+              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+              false),
+          new Object[] {"foo caught from 1: \u0001"});
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label9);
+      methodVisitor.visitLineNumber(18, label9);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label23 = new Label();
+      methodVisitor.visitLabel(label23);
+      methodVisitor.visitLineNumber(19, label23);
+      methodVisitor.visitJumpInsn(GOTO, label15);
+      methodVisitor.visitLabel(label8);
+      methodVisitor.visitLineNumber(18, label8);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 6);
+      methodVisitor.visitLabel(label10);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo post close 1");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ALOAD, 6);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label15);
+      methodVisitor.visitLineNumber(20, label15);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitTypeInsn(NEW, "java/util/jar/JarFile");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/util/jar/JarFile", "<init>", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label24 = new Label();
+      methodVisitor.visitLabel(label24);
+      methodVisitor.visitInsn(ACONST_NULL);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitLabel(label11);
+      methodVisitor.visitLineNumber(21, label11);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo opened 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label25 = new Label();
+      methodVisitor.visitLabel(label25);
+      methodVisitor.visitLineNumber(22, label25);
+      methodVisitor.visitTypeInsn(NEW, "java/lang/RuntimeException");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "()V", false);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label12);
+      methodVisitor.visitLineNumber(20, label12);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          4,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+            "java/lang/String",
+            "java/util/jar/JarFile",
+            "java/lang/Throwable"
+          },
+          1,
+          new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 4);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitVarInsn(ASTORE, 3);
+      methodVisitor.visitVarInsn(ALOAD, 4);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label14);
+      methodVisitor.visitLineNumber(23, label14);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 7);
+      methodVisitor.visitLabel(label13);
+      methodVisitor.visitVarInsn(ALOAD, 3);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKESTATIC,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+          "$closeResource",
+          "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 7);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label16);
+      methodVisitor.visitFrame(
+          Opcodes.F_FULL,
+          2,
+          new Object[] {
+            "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo", "java/lang/String"
+          },
+          1,
+          new Object[] {"java/lang/Exception"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      Label label26 = new Label();
+      methodVisitor.visitLabel(label26);
+      methodVisitor.visitLineNumber(24, label26);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Class", "getSimpleName", "()Ljava/lang/String;", false);
+      methodVisitor.visitInvokeDynamicInsn(
+          "makeConcatWithConstants",
+          "(Ljava/lang/String;)Ljava/lang/String;",
+          new Handle(
+              Opcodes.H_INVOKESTATIC,
+              "java/lang/invoke/StringConcatFactory",
+              "makeConcatWithConstants",
+              "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;",
+              false),
+          new Object[] {"foo caught from 2: \u0001"});
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitLabel(label17);
+      methodVisitor.visitLineNumber(26, label17);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo post close 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      Label label27 = new Label();
+      methodVisitor.visitLabel(label27);
+      methodVisitor.visitLineNumber(27, label27);
+      Label label28 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label28);
+      methodVisitor.visitLabel(label18);
+      methodVisitor.visitLineNumber(26, label18);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 8);
+      methodVisitor.visitLabel(label19);
+      methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+      methodVisitor.visitLdcInsn("foo post close 2");
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
+      methodVisitor.visitVarInsn(ALOAD, 8);
+      methodVisitor.visitInsn(ATHROW);
+      methodVisitor.visitLabel(label28);
+      methodVisitor.visitLineNumber(28, label28);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label29 = new Label();
+      methodVisitor.visitLabel(label29);
+      methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label20, label6, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label22, label9, 2);
+      methodVisitor.visitLocalVariable("f", "Ljava/util/jar/JarFile;", null, label24, label16, 2);
+      methodVisitor.visitLocalVariable("e", "Ljava/lang/Exception;", null, label26, label17, 2);
+      methodVisitor.visitLocalVariable(
+          "this",
+          "Ltwrcloseresourceduplication/TwrCloseResourceDuplication$Foo;",
+          null,
+          label5,
+          label29,
+          0);
+      methodVisitor.visitLocalVariable("name", "Ljava/lang/String;", null, label5, label29, 1);
+      methodVisitor.visitMaxs(3, 9);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC,
+              "$closeResource",
+              "(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V",
+              null,
+              null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      Label label1 = new Label();
+      Label label2 = new Label();
+      methodVisitor.visitTryCatchBlock(label0, label1, label2, "java/lang/Throwable");
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLineNumber(15, label3);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      Label label4 = new Label();
+      methodVisitor.visitJumpInsn(IFNULL, label4);
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label1);
+      Label label5 = new Label();
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Throwable"});
+      methodVisitor.visitVarInsn(ASTORE, 2);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitVarInsn(ALOAD, 2);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL, "java/lang/Throwable", "addSuppressed", "(Ljava/lang/Throwable;)V", false);
+      methodVisitor.visitJumpInsn(GOTO, label5);
+      methodVisitor.visitLabel(label4);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitVarInsn(ALOAD, 1);
+      methodVisitor.visitMethodInsn(
+          INVOKEINTERFACE, "java/lang/AutoCloseable", "close", "()V", true);
+      methodVisitor.visitLabel(label5);
+      methodVisitor.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+      methodVisitor.visitInsn(RETURN);
+      Label label6 = new Label();
+      methodVisitor.visitLabel(label6);
+      methodVisitor.visitLocalVariable("x0", "Ljava/lang/Throwable;", null, label3, label6, 0);
+      methodVisitor.visitLocalVariable("x1", "Ljava/lang/AutoCloseable;", null, label3, label6, 1);
+      methodVisitor.visitMaxs(2, 3);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java
new file mode 100644
index 0000000..1c05af0
--- /dev/null
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/asm/TwrCloseResourceDuplicationDump.java
@@ -0,0 +1,163 @@
+// Copyright (c) 2024, 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.
+
+/**
+ * Dump of class file for twr.twrcloseresourceduplication.TwrCloseResourceDuplication
+ *
+ * <p>*
+ *
+ * <p>This is used to get the JDK-9 javac code with `$closeResource`, which `-target 9` for later
+ * javac versions does not produce.
+ *
+ * <p>package twr.twrcloseresourceduplication;
+ *
+ * <p>import java.util.jar.JarFile;
+ *
+ * <p>public class TwrCloseResourceDuplication {
+ *
+ * <p>public static class Foo {
+ *
+ * <p>void foo(String name) { try (JarFile f = new JarFile(name)) { System.out.println("foo opened
+ * 1"); } catch (Exception e) { System.out.println("foo caught from 1: " +
+ * e.getClass().getSimpleName()); } finally { System.out.println("foo post close 1"); } try (JarFile
+ * f = new JarFile(name)) { System.out.println("foo opened 2"); throw new RuntimeException(); }
+ * catch (Exception e) { System.out.println("foo caught from 2: " + e.getClass().getSimpleName()); }
+ * finally { System.out.println("foo post close 2"); } } }
+ *
+ * <p>public static class Bar {
+ *
+ * <p>void bar(String name) { try (JarFile f = new JarFile(name)) { System.out.println("bar opened
+ * 1"); } catch (Exception e) { System.out.println("bar caught from 1: " +
+ * e.getClass().getSimpleName()); } finally { System.out.println("bar post close 1"); } try (JarFile
+ * f = new JarFile(name)) { System.out.println("bar opened 2"); throw new RuntimeException(); }
+ * catch (Exception e) { System.out.println("bar caught from 2: " + e.getClass().getSimpleName()); }
+ * finally { System.out.println("bar post close 2"); } } }
+ *
+ * <p>public static void main(String[] args) { new Foo().foo(args[0]); new Bar().bar(args[0]); } }
+ */
+package twr.twrcloseresourceduplication.asm;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.RecordComponentVisitor;
+
+public class TwrCloseResourceDuplicationDump implements Opcodes {
+
+  public static byte[] dump() throws Exception {
+
+    ClassWriter classWriter = new ClassWriter(0);
+    FieldVisitor fieldVisitor;
+    RecordComponentVisitor recordComponentVisitor;
+    MethodVisitor methodVisitor;
+    AnnotationVisitor annotationVisitor0;
+
+    classWriter.visit(
+        V9,
+        ACC_PUBLIC | ACC_SUPER,
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+        null,
+        "java/lang/Object",
+        null);
+
+    classWriter.visitSource("TwrCloseResourceDuplication.java", null);
+
+    classWriter.visitInnerClass(
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+        "Bar",
+        ACC_PUBLIC | ACC_STATIC);
+
+    classWriter.visitInnerClass(
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+        "twr/twrcloseresourceduplication/TwrCloseResourceDuplication",
+        "Foo",
+        ACC_PUBLIC | ACC_STATIC);
+
+    {
+      methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(8, label0);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
+      methodVisitor.visitInsn(RETURN);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLocalVariable(
+          "this",
+          "Ltwrcloseresourceduplication/TwrCloseResourceDuplication;",
+          null,
+          label0,
+          label1,
+          0);
+      methodVisitor.visitMaxs(1, 1);
+      methodVisitor.visitEnd();
+    }
+    {
+      methodVisitor =
+          classWriter.visitMethod(
+              ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
+      methodVisitor.visitCode();
+      Label label0 = new Label();
+      methodVisitor.visitLabel(label0);
+      methodVisitor.visitLineNumber(53, label0);
+      methodVisitor.visitTypeInsn(
+          NEW, "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+          "<init>",
+          "()V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Foo",
+          "foo",
+          "(Ljava/lang/String;)V",
+          false);
+      Label label1 = new Label();
+      methodVisitor.visitLabel(label1);
+      methodVisitor.visitLineNumber(54, label1);
+      methodVisitor.visitTypeInsn(
+          NEW, "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar");
+      methodVisitor.visitInsn(DUP);
+      methodVisitor.visitMethodInsn(
+          INVOKESPECIAL,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+          "<init>",
+          "()V",
+          false);
+      methodVisitor.visitVarInsn(ALOAD, 0);
+      methodVisitor.visitInsn(ICONST_0);
+      methodVisitor.visitInsn(AALOAD);
+      methodVisitor.visitMethodInsn(
+          INVOKEVIRTUAL,
+          "twr/twrcloseresourceduplication/TwrCloseResourceDuplication$Bar",
+          "bar",
+          "(Ljava/lang/String;)V",
+          false);
+      Label label2 = new Label();
+      methodVisitor.visitLabel(label2);
+      methodVisitor.visitLineNumber(55, label2);
+      methodVisitor.visitInsn(RETURN);
+      Label label3 = new Label();
+      methodVisitor.visitLabel(label3);
+      methodVisitor.visitLocalVariable("args", "[Ljava/lang/String;", null, label0, label3, 0);
+      methodVisitor.visitMaxs(3, 1);
+      methodVisitor.visitEnd();
+    }
+    classWriter.visitEnd();
+
+    return classWriter.toByteArray();
+  }
+}
diff --git a/src/test/examplesJava9/twraddsuppressed/TestClass.java b/src/test/examplesJava9/twraddsuppressed/TestClass.java
deleted file mode 100644
index fcf0d6f..0000000
--- a/src/test/examplesJava9/twraddsuppressed/TestClass.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2022, 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 twraddsuppressed;
-
-import java.io.Closeable;
-
-public class TestClass {
-
-  public static class MyClosable implements Closeable {
-
-    @Override
-    public void close() {
-      throw new RuntimeException("CLOSE");
-    }
-  }
-
-  public static void foo() {
-    throw new RuntimeException("FOO");
-  }
-
-  public static void bar() {
-    // NOTE: The $closeResource helper is _only_ generated by the JDK-9 compiler.
-    //
-    // Use twr twice to have javac generate a shared $closeResource helper.
-    try (MyClosable closable = new MyClosable()) {
-      foo();
-    }
-    try (MyClosable closable = new MyClosable()) {
-      foo();
-    }
-  }
-
-  public static void main(String[] args) {
-    try {
-      bar();
-    } catch (Exception e) {
-      Throwable[] suppressed = e.getSuppressed();
-      if (suppressed.length == 0) {
-        System.out.println("NONE");
-      } else {
-        for (Throwable throwable : suppressed) {
-          System.out.println(throwable.getMessage());
-        }
-      }
-    }
-  }
-}
diff --git a/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java b/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java
deleted file mode 100644
index d4dbf5b..0000000
--- a/src/test/examplesJava9/twrcloseresource/TwrCloseResourceTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-// 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 twrcloseresource;
-
-import java.util.jar.JarFile;
-
-public class TwrCloseResourceTest implements Iface {
-  public static void main(String[] args) {
-    TwrCloseResourceTest o = new TwrCloseResourceTest();
-    o.foo(args[0]);
-    o.iFoo(args[0]);
-    bar(args[0]);
-    Iface.iBar(args[0]);
-  }
-
-  synchronized void foo(String arg) {
-    try {
-      try (JarFile a = new JarFile(arg)) {
-        System.out.println("A");
-      } catch (Exception e) {
-        System.out.println("B");
-        try (JarFile a = new JarFile(arg)) {
-          System.out.println("C");
-        }
-        System.out.println("D");
-        throw new RuntimeException();
-      }
-      try (JarFile a = new JarFile(arg)) {
-        System.out.println("E");
-      }
-    } catch (Exception e) {
-      System.out.println("F");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("G");
-      try (JarFile b = new JarFile(arg)) {
-        System.out.println("H");
-      } finally {
-        System.out.println("I");
-        throw new RuntimeException();
-      }
-    } catch (Exception e) {
-      System.out.println("J");
-    }
-    System.out.println("K");
-  }
-
-  static synchronized void bar(String arg) {
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("1");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("2");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("3");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("4");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("5");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("6");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("7");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("8");
-    }
-    System.out.println("99");
-  }
-}
-
-interface Iface {
-  default void iFoo(String arg) {
-    try {
-      try (JarFile a = new JarFile(arg)) {
-        System.out.println("iA");
-      } catch (Exception e) {
-        System.out.println("iB");
-        try (JarFile a = new JarFile(arg)) {
-          System.out.println("iC");
-        }
-        System.out.println("iD");
-        throw new RuntimeException();
-      }
-      try (JarFile a = new JarFile(arg)) {
-        System.out.println("iE");
-      }
-    } catch (Exception e) {
-      System.out.println("iF");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("iG");
-      try (JarFile b = new JarFile(arg)) {
-        System.out.println("iH");
-      } finally {
-        System.out.println("iI");
-        throw new RuntimeException();
-      }
-    } catch (Exception e) {
-      System.out.println("iJ");
-    }
-    System.out.println("iK");
-  }
-
-  static void iBar(String arg) {
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("i1");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("i2");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("i3");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("i4");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("i5");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("i6");
-    }
-    try (JarFile a = new JarFile(arg)) {
-      System.out.println("i7");
-      throw new RuntimeException();
-    } catch (Exception e) {
-      System.out.println("i8");
-    }
-    System.out.println("i99");
-  }
-}
diff --git a/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java b/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java
deleted file mode 100644
index fa58d18..0000000
--- a/src/test/examplesJava9/twrcloseresourceduplication/TwrCloseResourceDuplication.java
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2022, 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 twrcloseresourceduplication;
-
-import java.util.jar.JarFile;
-
-public class TwrCloseResourceDuplication {
-
-  public static class Foo {
-
-    void foo(String name) {
-      try (JarFile f = new JarFile(name)) {
-        System.out.println("foo opened 1");
-      } catch (Exception e) {
-        System.out.println("foo caught from 1: " + e.getClass().getSimpleName());
-      } finally {
-        System.out.println("foo post close 1");
-      }
-      try (JarFile f = new JarFile(name)) {
-        System.out.println("foo opened 2");
-        throw new RuntimeException();
-      } catch (Exception e) {
-        System.out.println("foo caught from 2: " + e.getClass().getSimpleName());
-      } finally {
-        System.out.println("foo post close 2");
-      }
-    }
-  }
-
-  public static class Bar {
-
-    void bar(String name) {
-      try (JarFile f = new JarFile(name)) {
-        System.out.println("bar opened 1");
-      } catch (Exception e) {
-        System.out.println("bar caught from 1: " + e.getClass().getSimpleName());
-      } finally {
-        System.out.println("bar post close 1");
-      }
-      try (JarFile f = new JarFile(name)) {
-        System.out.println("bar opened 2");
-        throw new RuntimeException();
-      } catch (Exception e) {
-        System.out.println("bar caught from 2: " + e.getClass().getSimpleName());
-      } finally {
-        System.out.println("bar post close 2");
-      }
-    }
-  }
-
-  public static void main(String[] args) {
-    new Foo().foo(args[0]);
-    new Bar().bar(args[0]);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 8d43e3b..011d567 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -65,11 +65,6 @@
       return self();
     }
 
-    C withArg(String arg) {
-      args.add(arg);
-      return self();
-    }
-
     void combinedOptionConsumer(InternalOptions options) {
       for (Consumer<InternalOptions> consumer : optionConsumers) {
         consumer.accept(options);
@@ -136,11 +131,6 @@
   // Defines methods failing on JVM, specifies the output to be used for comparison.
   private static Map<String, String> expectedJvmResult =
       ImmutableMap.of(
-          "twr-close-resource",
-          "A\nE\nG\nH\nI\nJ\nK\n"
-              + "iA\niE\niG\niH\niI\niJ\niK\n"
-              + "1\n2\n3\n4\n5\n6\n7\n8\n99\n"
-              + "i1\ni2\ni3\ni4\ni5\ni6\ni7\ni8\ni99\n",
           "native-private-interface-methods",
           "0: s>i>a\n" + "1: d>i>s>i>a\n" + "2: l>i>s>i>a\n" + "3: x>s\n" + "4: c>d>i>s>i>a\n",
           "desugared-private-interface-methods",
@@ -200,16 +190,6 @@
         .run();
   }
 
-  @Test
-  public void testTwrCloseResourceMethod() throws Throwable {
-    TestRunner<?> test = test("twr-close-resource", "twrcloseresource", "TwrCloseResourceTest");
-    test
-        .withMinApiLevel(AndroidApiLevel.I.getLevel())
-        .withKeepAll()
-        .withArg(test.getInputJar().toAbsolutePath().toString())
-        .run();
-  }
-
   abstract RunExamplesJava9Test<B>.TestRunner<?> test(String testName, String packageName,
       String mainClass);
 
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
index 1e86eba..ba0f31f 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.suppressedexceptions;
 
-import static com.android.tools.r8.desugar.suppressedexceptions.TwrSuppressedExceptionsTest.getInvokesTo;
-import static com.android.tools.r8.desugar.suppressedexceptions.TwrSuppressedExceptionsTest.hasInvokesTo;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.DesugarTestConfiguration;
@@ -14,6 +12,10 @@
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.IntBox;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -136,4 +138,16 @@
       }
     }
   }
+
+  public static void hasInvokesTo(MethodSubject method, String callee, int count) {
+    List<InstructionSubject> getSuppressedCalls = getInvokesTo(method, callee);
+    assertEquals(count, getSuppressedCalls.size());
+  }
+
+  public static List<InstructionSubject> getInvokesTo(MethodSubject method, String callee) {
+    return method
+        .streamInstructions()
+        .filter(i -> i.isInvoke() && i.getMethod().getName().toString().equals(callee))
+        .collect(Collectors.toList());
+  }
 }