1 /*
2  * @test /nodynamiccopyright/
3  * @bug 8006733 8006775
4  * @summary Ensure behavior for nested types is correct.
5  * @author Werner Dietl
6  * @compile CantAnnotateStaticClass.java
7  */
8 
9 import java.util.List;
10 import java.util.ArrayList;
11 import java.util.HashMap;
12 import java.lang.annotation.*;
13 
14 class Top {
15     @Target(ElementType.TYPE_USE) @interface TA {}
16     @Target(ElementType.TYPE_USE) @interface TB1 {}
17     @Target(ElementType.TYPE_USE) @interface TB2 {}
18     @Target(ElementType.TYPE_USE) @interface TB3 {}
19     @Target(ElementType.TYPE_USE) @interface TB4 {}
20     @Target(ElementType.TYPE_USE) @interface TB5 {}
21     @Target(ElementType.TYPE_USE) @interface TB6 {}
22     @Target(ElementType.TYPE_USE) @interface TB7 {}
23     @Target(ElementType.TYPE_USE) @interface TB8 {}
24     @Target(ElementType.TYPE_USE) @interface TB9 {}
25     @Target(ElementType.TYPE_USE) @interface TB10 {}
26     @Target(ElementType.TYPE_USE) @interface TB11 {}
27     @Target(ElementType.TYPE_USE) @interface TB12 {}
28     @Target(ElementType.TYPE_USE) @interface TB13 {}
29     @Target(ElementType.TYPE_USE) @interface TB14 {}
30     @Target(ElementType.TYPE_USE) @interface TB15 {}
31     @Target(ElementType.TYPE_USE) @interface TB16 {}
32     @Target(ElementType.TYPE_USE) @interface TB17 {}
33     @Target(ElementType.TYPE_USE) @interface TB18 {}
34     @Target(ElementType.TYPE_USE) @interface TB19 {}
35     @Target(ElementType.TYPE_USE) @interface TB20 {}
36     @Target(ElementType.TYPE_USE) @interface TB21 {}
37     @Target(ElementType.TYPE_USE) @interface TB22 {}
38     @Target(ElementType.TYPE_USE) @interface TB23 {}
39     @Target(ElementType.TYPE_USE) @interface TB24 {}
40     @Target(ElementType.TYPE_USE) @interface TB25 {}
41     @Target(ElementType.TYPE_USE) @interface TB26 {}
42     @Target(ElementType.TYPE_USE) @interface TB27 {}
43     @Target(ElementType.TYPE_USE) @interface TB28 {}
44     @Target(ElementType.TYPE_USE) @interface TB29 {}
45     @Target(ElementType.TYPE_USE) @interface TB30 {}
46     @Target(ElementType.TYPE_USE) @interface TB31 {}
47     @Target(ElementType.TYPE_USE) @interface TB32 {}
48     @Target(ElementType.TYPE_USE) @interface TB33 {}
49     @Target(ElementType.TYPE_USE) @interface TB34 {}
50     @Target(ElementType.TYPE_USE) @interface TB35 {}
51     @Target(ElementType.TYPE_USE) @interface TB36 {}
52     @Target(ElementType.TYPE_USE) @interface TB37 {}
53     @Target(ElementType.TYPE_USE) @interface TB38 {}
54     @Target(ElementType.TYPE_USE) @interface TB39 {}
55     @Target(ElementType.TYPE_USE) @interface TB40 {}
56     @Target(ElementType.TYPE_USE) @interface TB41 {}
57     @Target(ElementType.TYPE_USE) @interface TC {}
58 
59     class Outer {
60         class Inner {
61             Object o1 = Top.this;
62             Object o2 = Outer.this;
63             Object o3 = this;
64         }
65         // Illegal
66         // static class SInner {}
67         // interface IInner {}
68     }
69 
70     // All combinations are OK
71 
72     Top.@TB1 Outer f1;
73     @TB2 Outer.Inner f1a;
74     Outer. @TC Inner f1b;
75     @TB3 Outer. @TC Inner f1c;
76 
77     @TA Top. @TB4 Outer f2;
78     @TA Top. @TB5 Outer.Inner f2a;
79     @TA Top. Outer. @TC Inner f2b;
80     @TA Top. @TB6 Outer. @TC Inner f2c;
81 
f1r()82     @TB7 Outer f1r() { return null; }
f1ra()83     @TB8 Outer.Inner f1ra() { return null; }
f1rb()84     Outer. @TC Inner f1rb() { return null; }
f1rc()85     @TB9 Outer. @TC Inner f1rc() { return null; }
86 
f1param(@B41 Outer p, @TB10 Outer.Inner p1, Outer. @TC Inner p2, @TB11 Outer. @TC Inner p3)87     void f1param(@TB41 Outer p,
88             @TB10 Outer.Inner p1,
89             Outer. @TC Inner p2,
90             @TB11 Outer. @TC Inner p3) { }
91 
f1cast(Object o)92     void f1cast(Object o) {
93         Object l;
94         l = (@TB12 Outer) o;
95         l = (@TB13 Outer.Inner) o;
96         l = (Outer. @TC Inner) o;
97         l = (@TB14 Outer. @TC Inner) o;
98     }
99 
100     List<@TB15 Outer> g1;
101     List<@TB16 Outer.Inner> g1a;
102     List<Outer. @TC Inner> g1b;
103     List<@TB17 Outer. @TC Inner> g1c;
104 
105     List<@TA Top. @TB18 Outer> g2;
106     List<@TA Top. @TB19 Outer.Inner> g2a;
107     List<@TA Top. Outer. @TC Inner> g2b;
108     List<@TA Top. @TB20 Outer. @TC Inner> g2c;
109 
g1r()110     List<@TB21 Outer> g1r() { return null; }
g1ra()111     List<@TB22 Outer.Inner> g1ra() { return null; }
g1rb()112     List<Outer. @TC Inner> g1rb() { return null; }
g1rc()113     List<@TB23 Outer. @TC Inner> g1rc() { return null; }
114 
g1param(List<@TB24 Outer> p, List<@TB25 Outer.Inner> p1, List<Outer. @TC Inner> p2, List<@TB26 Outer. @TC Inner> p3)115     void g1param(List<@TB24 Outer> p,
116             List<@TB25 Outer.Inner> p1,
117             List<Outer. @TC Inner> p2,
118             List<@TB26 Outer. @TC Inner> p3) { }
119 
g1new(Object o)120     void g1new(Object o) {
121         Object l;
122         l = new @TB27 ArrayList<@TB28 Outer>();
123         l = new @TB29 ArrayList<@TB30 Outer.Inner>();
124         l = new @TB31 HashMap<String, Outer. @TC Inner>();
125         l = new @TB32 HashMap<String, @TB33 Outer. Inner>();
126         l = new @TB34 HashMap<String, @TB35 Outer. @TC Inner>();
127         l = new @TB36 HashMap<String, @TA Top. Outer. @TC Inner>();
128         l = new @TB37 HashMap<String, @TA Top. @TB38 Outer. Inner>();
129         l = new @TB39 HashMap<String, @TA Top. @TB40 Outer. @TC Inner>();
130     }
131 }
132