/* @test /nodynamiccopyright/ * @bug 7196163 * @summary Verify that variables can be used as operands to try-with-resources * @compile/fail/ref=TwrForVariable1.out -source 8 -XDrawDiagnostics -Xlint:-options TwrForVariable1.java * @compile TwrForVariable1.java * @run main TwrForVariable1 */ public class TwrForVariable1 implements AutoCloseable { private static int closeCount = 0; public static void main(String... args) { TwrForVariable1 v = new TwrForVariable1(); try (v) { assertCloseCount(0); } try (/**@deprecated*/v) { assertCloseCount(1); } try (v.finalWrapper.finalField) { assertCloseCount(2); } catch (Exception ex) { } try (new TwrForVariable1() { }.finalWrapper.finalField) { assertCloseCount(3); } catch (Exception ex) { } try ((args.length > 0 ? v : new TwrForVariable1()).finalWrapper.finalField) { assertCloseCount(4); } catch (Exception ex) { } try { throw new CloseableException(); } catch (CloseableException ex) { try (ex) { assertCloseCount(5); } } assertCloseCount(6); // null test cases TwrForVariable1 n = null; try (n) { } try (n) { throw new Exception(); } catch (Exception e) { } assertCloseCount(6); // initialization exception TwrForVariable1 i1 = new TwrForVariable1(); try (i1; TwrForVariable1 i2 = new TwrForVariable1(true)) { } catch (Exception e) { } assertCloseCount(7); // multiple closures TwrForVariable1 m1 = new TwrForVariable1(); try (m1; TwrForVariable1 m2 = m1; TwrForVariable1 m3 = m2;) { } assertCloseCount(10); // aliasing of variables keeps equality (bugs 6911256 6964740) TwrForVariable1 a1 = new TwrForVariable1(); try (a1; TwrForVariable1 a2 = a1;) { if (a2 != a2) throw new RuntimeException("Unexpected inequality."); } assertCloseCount(12); // anonymous class implementing AutoCloseable as variable in twr AutoCloseable a = new AutoCloseable() { public void close() { }; }; try (a) { } catch (Exception e) {} } static void assertCloseCount(int expectedCloseCount) { if (closeCount != expectedCloseCount) throw new RuntimeException("bad closeCount: " + closeCount + "; expected: " + expectedCloseCount); } public void close() { closeCount++; } final FinalWrapper finalWrapper = new FinalWrapper(); static class FinalWrapper { public final AutoCloseable finalField = new AutoCloseable() { @Override public void close() throws Exception { closeCount++; } }; } static class CloseableException extends Exception implements AutoCloseable { @Override public void close() { closeCount++; } } public TwrForVariable1(boolean throwException) { if (throwException) throw new RuntimeException("Initialization exception"); } public TwrForVariable1() { this(false); } }