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 
  47     @TB Outer f1r() { return null; }
  48     @TB Outer.Inner f1ra() { return null; }
  49     Outer. @TC Inner f1rb() { return null; }
  50     @TB Outer. @TC Inner f1rc() { return null; }
  51 
  52     void f1param(@TB Outer p,
  53             @TB Outer.Inner p1,
  54             Outer. @TC Inner p2,
  55             @TB Outer. @TC Inner p3) { }
  56 
  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 
  75     List<@TB Outer> g1r() { return null; }
  76     List<@TB Outer.Inner> g1ra() { return null; }
  77     List<Outer. @TC Inner> g1rb() { return null; }
  78     List<@TB Outer. @TC Inner> g1rc() { return null; }
  79 
  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 
  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 }