1.1 --- a/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java Tue Oct 15 22:15:35 2013 +0200 1.2 +++ b/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java Tue Oct 15 15:57:13 2013 -0700 1.3 @@ -1,41 +1,96 @@ 1.4 /* 1.5 * @test /nodynamiccopyright/ 1.6 * @bug 8006733 8006775 1.7 - 1.8 - * @summary A static outer class cannot be annotated. 1.9 + * @summary Ensure behavior for nested types is correct. 1.10 * @author Werner Dietl 1.11 - * @compile/fail/ref=CantAnnotateStaticClass.out -XDrawDiagnostics CantAnnotateStaticClass.java 1.12 + * @compile CantAnnotateStaticClass.java 1.13 */ 1.14 1.15 import java.util.List; 1.16 +import java.util.ArrayList; 1.17 +import java.util.HashMap; 1.18 import java.lang.annotation.*; 1.19 1.20 -class CantAnnotateStaticClass { 1.21 +class Top { 1.22 @Target(ElementType.TYPE_USE) 1.23 - @interface A {} 1.24 + @interface TA {} 1.25 1.26 - static class Outer { 1.27 - class Inner {} 1.28 + @Target(ElementType.TYPE_USE) 1.29 + @interface TB {} 1.30 + 1.31 + @Target(ElementType.TYPE_USE) 1.32 + @interface TC {} 1.33 + 1.34 + class Outer { 1.35 + class Inner { 1.36 + Object o1 = Top.this; 1.37 + Object o2 = Outer.this; 1.38 + Object o3 = this; 1.39 + } 1.40 + // Illegal 1.41 + // static class SInner {} 1.42 + // interface IInner {} 1.43 } 1.44 1.45 - // 8 errors: 1.46 - @A Outer.Inner f1; 1.47 - @A Outer.Inner f1r() { return null; } 1.48 - void f1p(@A Outer.Inner p) { } 1.49 - void f1c(Object o) { 1.50 - Object l = (@A Outer.Inner) o; 1.51 + // All combinations are OK 1.52 + 1.53 + Top.@TB Outer f1; 1.54 + @TB Outer.Inner f1a; 1.55 + Outer. @TC Inner f1b; 1.56 + @TB Outer. @TC Inner f1c; 1.57 + 1.58 + @TA Top. @TB Outer f2; 1.59 + @TA Top. @TB Outer.Inner f2a; 1.60 + @TA Top. Outer. @TC Inner f2b; 1.61 + @TA Top. @TB Outer. @TC Inner f2c; 1.62 + 1.63 + @TB Outer f1r() { return null; } 1.64 + @TB Outer.Inner f1ra() { return null; } 1.65 + Outer. @TC Inner f1rb() { return null; } 1.66 + @TB Outer. @TC Inner f1rc() { return null; } 1.67 + 1.68 + void f1param(@TB Outer p, 1.69 + @TB Outer.Inner p1, 1.70 + Outer. @TC Inner p2, 1.71 + @TB Outer. @TC Inner p3) { } 1.72 + 1.73 + void f1cast(Object o) { 1.74 + Object l; 1.75 + l = (@TB Outer) o; 1.76 + l = (@TB Outer.Inner) o; 1.77 + l = (Outer. @TC Inner) o; 1.78 + l = (@TB Outer. @TC Inner) o; 1.79 } 1.80 1.81 - List<@A Outer.Inner> f2; 1.82 - List<@A Outer.Inner> f2r() { return null; } 1.83 - void f2p(List<@A Outer.Inner> p) { } 1.84 - void f2c(Object o) { 1.85 - Object l = (List<@A Outer.Inner>) o; 1.86 + List<@TB Outer> g1; 1.87 + List<@TB Outer.Inner> g1a; 1.88 + List<Outer. @TC Inner> g1b; 1.89 + List<@TB Outer. @TC Inner> g1c; 1.90 + 1.91 + List<@TA Top. @TB Outer> g2; 1.92 + List<@TA Top. @TB Outer.Inner> g2a; 1.93 + List<@TA Top. Outer. @TC Inner> g2b; 1.94 + List<@TA Top. @TB Outer. @TC Inner> g2c; 1.95 + 1.96 + List<@TB Outer> g1r() { return null; } 1.97 + List<@TB Outer.Inner> g1ra() { return null; } 1.98 + List<Outer. @TC Inner> g1rb() { return null; } 1.99 + List<@TB Outer. @TC Inner> g1rc() { return null; } 1.100 + 1.101 + void g1param(List<@TB Outer> p, 1.102 + List<@TB Outer.Inner> p1, 1.103 + List<Outer. @TC Inner> p2, 1.104 + List<@TB Outer. @TC Inner> p3) { } 1.105 + 1.106 + void g1new(Object o) { 1.107 + Object l; 1.108 + l = new @TB ArrayList<@TB Outer>(); 1.109 + l = new @TB ArrayList<@TB Outer.Inner>(); 1.110 + l = new @TB HashMap<String, Outer. @TC Inner>(); 1.111 + l = new @TB HashMap<String, @TB Outer. Inner>(); 1.112 + l = new @TB HashMap<String, @TB Outer. @TC Inner>(); 1.113 + l = new @TB HashMap<String, @TA Top. Outer. @TC Inner>(); 1.114 + l = new @TB HashMap<String, @TA Top. @TB Outer. Inner>(); 1.115 + l = new @TB HashMap<String, @TA Top. @TB Outer. @TC Inner>(); 1.116 } 1.117 - 1.118 - // OK: 1.119 - @A Outer g1; 1.120 - List<@A Outer> g2; 1.121 - Outer. @A Inner g3; 1.122 - List<Outer. @A Inner> g4; 1.123 }