/* * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 4102566 * @summary Test access methods for assignment targets. * @author William Maddox (maddox) * * @compile AccessMethodsLHS.java * @run main AccessMethodsLHS */ public class AccessMethodsLHS { static void fail(String msg) throws Exception { throw new Exception("FAIL: " + msg); } static int arg = 123456; private int i; private double d; private void m(int x) throws Exception { System.out.println("called AccessMethodsLHS.m"); if (x != 123456) AccessMethodsLHS.fail("bad argument"); } public static class Bar { private int i; private double d; private String s; private void m(int x) throws Exception { System.out.println("called AccessMethodsLHS.Bar.m"); if (x != 123456) AccessMethodsLHS.fail("bad argument"); } // Static members are permitted in a static inner class. static private int si; static private double sd; static private String ss; static private void sm(int x) throws Exception { System.out.println("called AccessMethodsLHS.Bar.sm"); if (x != 123456) AccessMethodsLHS.fail("bad argument"); } } public static class Baz { private int i; private double d; private String s; private void m(int x) throws Exception { System.out.println("called Baz.m"); if (x != 123456) AccessMethodsLHS.fail("bad argument"); } // Compiler rejects static members here correctly. // static private int si; // static private double sd; // static private String ss; } public class Quux { void DoIt () throws Exception { m(arg); i = 1; d = 1.0; i += 5; i--; } void DoMore(AccessMethodsLHS f) throws Exception { f.m(arg); } } public static class Quem { void DoIt () { // Illegal static refs to non-static vars // i = 1; // d = 1.0; // i += 5; // i--; } } static int effects = 0; static Bar iBar(Bar x) { effects++; return x; } static Baz iBaz(Baz x) { effects++; return x; } static void checkEffects(int i) throws Exception { if (effects != 1) { AccessMethodsLHS.fail("incorrect side-effect behavior (" + effects + "): " + i); } effects = 0; } static public void main(String args[]) throws Exception { Bar b = new Bar(); Baz c = new Baz(); System.out.println("testing assignment"); AccessMethodsLHS f = new AccessMethodsLHS(); Quux q1 = f.new Quux(); q1.DoIt(); q1.DoMore(f); Quem q2 = new Quem(); q2.DoIt(); // *** Static class, Non-static members *** b.m(arg); // Integer (1 word) b.i = 5; System.out.println(b.i); if (b.i != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.i); if ((b.i += 10) != 15) AccessMethodsLHS.fail("add-assign result"); System.out.println(b.i); if (b.i != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.i); b.s = "foo"; if (!(b.s += "bar").equals("foobar")) AccessMethodsLHS.fail("concat-assign result"); System.out.println(b.s); if (!b.s.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect"); System.out.println(b.s); b.s = "foo"; b.s += "bar"; if (!b.s.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect (novalue)"); System.out.println(b.s); b.i = 0; b.i++; if (b.i != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.i); b.i = 5; if (b.i++ != 5) AccessMethodsLHS.fail("post-increment result"); if (b.i != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.i); b.i = 1; --b.i; if (b.i != 0) AccessMethodsLHS.fail("pre-decrement effect"); b.i = 5; if (--b.i != 4) AccessMethodsLHS.fail("pre-decrement result"); if (b.i != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.i); // Double (2 word) b.d = 5.0; System.out.println(b.d); if (b.d != 5.0) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.d); if ((b.d += 10) != 15.0) AccessMethodsLHS.fail("add-assign result"); System.out.println(b.d); if (b.d != 15.0) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.d); b.d = 0.0; b.d++; if (b.d != 1.0) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.d); b.d = 5.0; if (b.d++ != 5.0) AccessMethodsLHS.fail("post-increment result"); if (b.d != 6.0) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.d); b.d = 1.0; --b.d; if (b.d != 0.0) AccessMethodsLHS.fail("pre-decrement effect"); b.d = 5.0; if (--b.d != 4.0) AccessMethodsLHS.fail("pre-decrement result"); if (b.d != 4.0) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.d); // Integer (1 word) with side-effects in object reference iBar(b).i = 5; checkEffects(1); System.out.println(b.i); if (b.i != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.i); if ((iBar(b).i += 10) != 15) AccessMethodsLHS.fail("add-assign result"); checkEffects(2); System.out.println(b.i); if (b.i != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.i); b.i = 0; iBar(b).i++; checkEffects(3); if (b.i != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.i); b.i = 5; if (iBar(b).i++ != 5) AccessMethodsLHS.fail("post-increment result"); checkEffects(4); if (b.i != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.i); b.i = 1; --iBar(b).i; checkEffects(5); if (b.i != 0) AccessMethodsLHS.fail("pre-decrement effect"); b.i = 5; if (--iBar(b).i != 4) AccessMethodsLHS.fail("pre-decrement result"); checkEffects(6); if (b.i != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.i); // *** Static class, Static members *** Bar.sm(arg); // Integer (1 word) Bar.si = 5; System.out.println(Bar.si); if (Bar.si != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(Bar.si); if ((Bar.si += 10) != 15) AccessMethodsLHS.fail("add-assign result"); System.out.println(Bar.si); if (Bar.si != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(Bar.si); Bar.ss = "foo"; if (!(Bar.ss += "bar").equals("foobar")) AccessMethodsLHS.fail("concat-assign result"); System.out.println(Bar.ss); if (!Bar.ss.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect"); System.out.println(Bar.ss); Bar.ss = "foo"; Bar.ss += "bar"; if (!Bar.ss.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect (novalue)"); System.out.println(Bar.ss); Bar.si = 0; Bar.si++; if (Bar.si != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(Bar.si); Bar.si = 5; if (Bar.si++ != 5) AccessMethodsLHS.fail("post-increment result"); if (Bar.si != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(Bar.si); Bar.si = 1; --Bar.si; if (Bar.si != 0) AccessMethodsLHS.fail("pre-decrement effect"); Bar.si = 5; if (--Bar.si != 4) AccessMethodsLHS.fail("pre-decrement result"); if (Bar.si != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(Bar.si); // Double (2 word) Bar.sd = 5.0; System.out.println(Bar.sd); if (Bar.sd != 5.0) AccessMethodsLHS.fail("simple assignment"); System.out.println(Bar.sd); if ((Bar.sd += 10) != 15.0) AccessMethodsLHS.fail("add-assign result"); System.out.println(Bar.sd); if (Bar.sd != 15.0) AccessMethodsLHS.fail("add-assign effect"); System.out.println(Bar.sd); Bar.sd = 0.0; Bar.sd++; if (Bar.sd != 1.0) AccessMethodsLHS.fail("post-increment effect"); System.out.println(Bar.sd); Bar.sd = 5.0; if (Bar.sd++ != 5.0) AccessMethodsLHS.fail("post-increment result"); if (Bar.sd != 6.0) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(Bar.sd); Bar.sd = 1.0; --Bar.sd; if (Bar.sd != 0.0) AccessMethodsLHS.fail("pre-decrement effect"); Bar.sd = 5.0; if (--Bar.sd != 4.0) AccessMethodsLHS.fail("pre-decrement result"); if (Bar.sd != 4.0) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(Bar.sd); // *** Static class, Static members (invoked via object reference) *** b.sm(arg); iBar(b).sm(arg); checkEffects(101); // Integer (1 word) b.si = 5; System.out.println(b.si); if (b.si != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.si); if ((b.si += 10) != 15) AccessMethodsLHS.fail("add-assign result"); System.out.println(b.si); if (b.si != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.si); b.ss = "foo"; if (!(b.ss += "bar").equals("foobar")) AccessMethodsLHS.fail("concat-assign result"); System.out.println(b.ss); if (!b.ss.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect"); System.out.println(b.ss); b.ss = "foo"; b.ss += "bar"; if (!b.ss.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect (novalue)"); System.out.println(b.ss); b.si = 0; b.si++; if (b.si != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.si); b.si = 5; if (b.si++ != 5) AccessMethodsLHS.fail("post-increment result"); if (b.si != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.si); b.si = 1; --b.si; if (b.si != 0) AccessMethodsLHS.fail("pre-decrement effect"); b.si = 5; if (--b.si != 4) AccessMethodsLHS.fail("pre-decrement result"); if (b.si != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.si); // Double (2 word) b.sd = 5.0; System.out.println(b.sd); if (b.sd != 5.0) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.sd); if ((b.sd += 10) != 15.0) AccessMethodsLHS.fail("add-assign result"); System.out.println(b.sd); if (b.sd != 15.0) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.sd); b.sd = 0.0; b.sd++; if (b.sd != 1.0) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.sd); b.sd = 5.0; if (b.sd++ != 5.0) AccessMethodsLHS.fail("post-increment result"); if (b.sd != 6.0) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.sd); b.sd = 1.0; --b.sd; if (b.sd != 0.0) AccessMethodsLHS.fail("pre-decrement effect"); b.sd = 5.0; if (--b.sd != 4.0) AccessMethodsLHS.fail("pre-decrement result"); if (b.sd != 4.0) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.sd); // Integer (1 word) with side-effects in object reference iBar(b).si = 5; checkEffects(7); System.out.println(b.si); if (b.si != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(b.si); if ((iBar(b).si += 10) != 15) AccessMethodsLHS.fail("add-assign result"); checkEffects(8); System.out.println(b.si); if (b.si != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(b.si); iBar(b).si = 0; checkEffects(9); iBar(b).si++; checkEffects(10); if (b.si != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(b.si); b.si = 5; if (iBar(b).si++ != 5) AccessMethodsLHS.fail("post-increment result"); checkEffects(11); if (b.si != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(b.si); b.si = 1; --iBar(b).si; checkEffects(12); if (b.si != 0) AccessMethodsLHS.fail("pre-decrement effect"); b.si = 5; if (--iBar(b).si != 4) AccessMethodsLHS.fail("pre-decrement result"); checkEffects(13); if (b.si != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(b.si); // *** Non-static class, Non-static members *** c.m(arg); iBaz(c).m(arg); checkEffects(102); // Integer (1 word) c.i = 5; System.out.println(c.i); if (c.i != 5) AccessMethodsLHS.fail("simple assignment"); System.out.println(c.i); if ((c.i += 10) != 15) AccessMethodsLHS.fail("add-assign result"); System.out.println(c.i); if (c.i != 15) AccessMethodsLHS.fail("add-assign effect"); System.out.println(c.i); c.s = "foo"; if (!(c.s += "bar").equals("foobar")) AccessMethodsLHS.fail("concat-assign result"); System.out.println(c.s); if (!c.s.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect"); System.out.println(c.s); c.s = "foo"; c.s += "bar"; if (!c.s.equals("foobar")) AccessMethodsLHS.fail("concat-assign effect (novalue)"); System.out.println(c.s); c.i = 0; c.i++; if (c.i != 1) AccessMethodsLHS.fail("post-increment effect"); System.out.println(c.i); c.i = 5; if (c.i++ != 5) AccessMethodsLHS.fail("post-increment result"); if (c.i != 6) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(c.i); c.i = 1; --c.i; if (c.i != 0) AccessMethodsLHS.fail("pre-decrement effect"); c.i = 5; if (--c.i != 4) AccessMethodsLHS.fail("pre-decrement result"); if (c.i != 4) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(c.i); // Double (2 word) c.d = 5.0; System.out.println(c.d); if (c.d != 5.0) AccessMethodsLHS.fail("simple assignment"); System.out.println(c.d); if ((c.d += 10) != 15.0) AccessMethodsLHS.fail("add-assign result"); System.out.println(c.d); if (c.d != 15.0) AccessMethodsLHS.fail("add-assign effect"); System.out.println(c.d); c.d = 0.0; c.d++; if (c.d != 1.0) AccessMethodsLHS.fail("post-increment effect"); System.out.println(c.d); c.d = 5.0; if (c.d++ != 5.0) AccessMethodsLHS.fail("post-increment result"); if (c.d != 6.0) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(c.d); c.d = 1.0; --c.d; if (c.d != 0.0) AccessMethodsLHS.fail("pre-decrement effect"); c.d = 5.0; if (--c.d != 4.0) AccessMethodsLHS.fail("pre-decrement result"); if (c.d != 4.0) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(c.d); // Double (2 word) with side-effects in object reference iBaz(c).d = 5.0; checkEffects(14); System.out.println(c.d); if (c.d != 5.0) AccessMethodsLHS.fail("simple assignment"); System.out.println(c.d); if ((iBaz(c).d += 10) != 15.0) AccessMethodsLHS.fail("add-assign result"); checkEffects(15); System.out.println(c.d); if (c.d != 15.0) AccessMethodsLHS.fail("add-assign effect"); System.out.println(c.d); c.d = 0.0; iBaz(c).d++; checkEffects(16); if (c.d != 1.0) AccessMethodsLHS.fail("post-increment effect"); System.out.println(c.d); c.d = 5.0; if (iBaz(c).d++ != 5.0) AccessMethodsLHS.fail("post-increment result"); checkEffects(17); if (c.d != 6.0) AccessMethodsLHS.fail("post-increment effect (embedded)"); System.out.println(c.d); c.d = 1.0; --iBaz(c).d; checkEffects(18); if (c.d != 0.0) AccessMethodsLHS.fail("pre-decrement effect"); c.d = 5.0; if (--iBaz(c).d != 4.0) AccessMethodsLHS.fail("pre-decrement result"); checkEffects(19); if (c.d != 4.0) AccessMethodsLHS.fail("pre-decrement effect (embedded)"); System.out.println(c.d); // All done. System.out.println("done"); } }