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 
  82     @TB7 Outer f1r() { return null; }
  83     @TB8 Outer.Inner f1ra() { return null; }
  84     Outer. @TC Inner f1rb() { return null; }
  85     @TB9 Outer. @TC Inner f1rc() { return null; }
  86 
  87     void f1param(@TB41 Outer p,
  88             @TB10 Outer.Inner p1,
  89             Outer. @TC Inner p2,
  90             @TB11 Outer. @TC Inner p3) { }
  91 
  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 
 110     List<@TB21 Outer> g1r() { return null; }
 111     List<@TB22 Outer.Inner> g1ra() { return null; }
 112     List<Outer. @TC Inner> g1rb() { return null; }
 113     List<@TB23 Outer. @TC Inner> g1rc() { return null; }
 114 
 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 
 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 }