1 /*
2  * Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 4091327 4079087
27  * @summary Verify resolution of qualified outer class 'this' references.
28  * @author William Maddox (maddox) [shamelessly cribbed from bug report]
29  *
30  * @clean QualifiedOuterThis QualifiedOuterThis$Y QualifiedOuterThis$Y$Z
31  * @compile QualifiedOuterThis.java
32  * @run main QualifiedOuterThis
33  */
34 
35 public class QualifiedOuterThis {
36     static StringBuffer sb = new StringBuffer();
toString()37     public String toString() { sb.append('X'); return "X"; }
test()38     void test() {
39         class Y {
40             public String toString() { sb.append('Y'); return "Y"; }
41             class Z {
42                 public String toString() { sb.append('Z'); return "Z"; }
43                 void test() {
44                     System.out.println(this.toString());
45                     System.out.println(Y.this.toString());
46                     System.out.println(QualifiedOuterThis.this.toString());
47                 }
48             }
49             void test() {
50                 new Z().test();
51             }
52         }
53         new Y().test();
54     }
main(String[] s)55     public static void main(String[] s) throws Exception {
56         QualifiedOuterThis x = new QualifiedOuterThis();
57         x.test();  // Print Z Y X
58         System.out.println(sb.toString());
59         if (!sb.toString().equals("ZYX")) {
60             throw new Exception("incorrect outer instance method called!");
61         }
62     }
63 }
64