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)
16     @interface TA {}
17 
18     @Target(ElementType.TYPE_USE)
19     @interface TB {}
20 
21     @Target(ElementType.TYPE_USE)
22     @interface TC {}
23 
24     class Outer {
25         class Inner {
26             Object o1 = Top.this;
27             Object o2 = Outer.this;
28             Object o3 = this;
29         }
30         // Illegal
31         // static class SInner {}
32         // interface IInner {}
33     }
34 
35     // All combinations are OK
36 
37     Top.@TB Outer f1;
38     @TB Outer.Inner f1a;
39     Outer. @TC Inner f1b;
40     @TB Outer. @TC Inner f1c;
41 
42     @TA Top. @TB Outer f2;
43     @TA Top. @TB Outer.Inner f2a;
44     @TA Top. Outer. @TC Inner f2b;
45     @TA Top. @TB Outer. @TC Inner f2c;
46 
f1r()47     @TB Outer f1r() { return null; }
f1ra()48     @TB Outer.Inner f1ra() { return null; }
f1rb()49     Outer. @TC Inner f1rb() { return null; }
f1rc()50     @TB Outer. @TC Inner f1rc() { return null; }
51 
f1param(@B Outer p, @TB Outer.Inner p1, Outer. @TC Inner p2, @TB Outer. @TC Inner p3)52     void f1param(@TB Outer p,
53             @TB Outer.Inner p1,
54             Outer. @TC Inner p2,
55             @TB Outer. @TC Inner p3) { }
56 
f1cast(Object o)57     void f1cast(Object o) {
58         Object l;
59         l = (@TB Outer) o;
60         l = (@TB Outer.Inner) o;
61         l = (Outer. @TC Inner) o;
62         l = (@TB Outer. @TC Inner) o;
63     }
64 
65     List<@TB Outer> g1;
66     List<@TB Outer.Inner> g1a;
67     List<Outer. @TC Inner> g1b;
68     List<@TB Outer. @TC Inner> g1c;
69 
70     List<@TA Top. @TB Outer> g2;
71     List<@TA Top. @TB Outer.Inner> g2a;
72     List<@TA Top. Outer. @TC Inner> g2b;
73     List<@TA Top. @TB Outer. @TC Inner> g2c;
74 
g1r()75     List<@TB Outer> g1r() { return null; }
g1ra()76     List<@TB Outer.Inner> g1ra() { return null; }
g1rb()77     List<Outer. @TC Inner> g1rb() { return null; }
g1rc()78     List<@TB Outer. @TC Inner> g1rc() { return null; }
79 
g1param(List<@TB Outer> p, List<@TB Outer.Inner> p1, List<Outer. @TC Inner> p2, List<@TB Outer. @TC Inner> p3)80     void g1param(List<@TB Outer> p,
81             List<@TB Outer.Inner> p1,
82             List<Outer. @TC Inner> p2,
83             List<@TB Outer. @TC Inner> p3) { }
84 
g1new(Object o)85     void g1new(Object o) {
86         Object l;
87         l = new @TB ArrayList<@TB Outer>();
88         l = new @TB ArrayList<@TB Outer.Inner>();
89         l = new @TB HashMap<String, Outer. @TC Inner>();
90         l = new @TB HashMap<String, @TB Outer. Inner>();
91         l = new @TB HashMap<String, @TB Outer. @TC Inner>();
92         l = new @TB HashMap<String, @TA Top. Outer. @TC Inner>();
93         l = new @TB HashMap<String, @TA Top. @TB Outer. Inner>();
94         l = new @TB HashMap<String, @TA Top. @TB Outer. @TC Inner>();
95     }
96 }
97