langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java
changeset 21041 99f5e5e97425
parent 21010 5ffe0d8a5e24
child 24895 dd091d389fbf
--- a/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java	Tue Oct 15 22:15:35 2013 +0200
+++ b/langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java	Tue Oct 15 15:57:13 2013 -0700
@@ -1,41 +1,96 @@
 /*
  * @test /nodynamiccopyright/
  * @bug 8006733 8006775
-
- * @summary A static outer class cannot be annotated.
+ * @summary Ensure behavior for nested types is correct.
  * @author Werner Dietl
- * @compile/fail/ref=CantAnnotateStaticClass.out -XDrawDiagnostics CantAnnotateStaticClass.java
+ * @compile CantAnnotateStaticClass.java
  */
 
 import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.lang.annotation.*;
 
-class CantAnnotateStaticClass {
+class Top {
+    @Target(ElementType.TYPE_USE)
+    @interface TA {}
+
+    @Target(ElementType.TYPE_USE)
+    @interface TB {}
+
     @Target(ElementType.TYPE_USE)
-    @interface A {}
+    @interface TC {}
 
-    static class Outer {
-        class Inner {}
+    class Outer {
+        class Inner {
+            Object o1 = Top.this;
+            Object o2 = Outer.this;
+            Object o3 = this;
+        }
+        // Illegal
+        // static class SInner {}
+        // interface IInner {}
     }
 
-    // 8 errors:
-    @A Outer.Inner f1;
-    @A Outer.Inner f1r() { return null; }
-    void f1p(@A Outer.Inner p) { }
-    void f1c(Object o) {
-        Object l = (@A Outer.Inner) o;
+    // All combinations are OK
+
+    Top.@TB Outer f1;
+    @TB Outer.Inner f1a;
+    Outer. @TC Inner f1b;
+    @TB Outer. @TC Inner f1c;
+
+    @TA Top. @TB Outer f2;
+    @TA Top. @TB Outer.Inner f2a;
+    @TA Top. Outer. @TC Inner f2b;
+    @TA Top. @TB Outer. @TC Inner f2c;
+
+    @TB Outer f1r() { return null; }
+    @TB Outer.Inner f1ra() { return null; }
+    Outer. @TC Inner f1rb() { return null; }
+    @TB Outer. @TC Inner f1rc() { return null; }
+
+    void f1param(@TB Outer p,
+            @TB Outer.Inner p1,
+            Outer. @TC Inner p2,
+            @TB Outer. @TC Inner p3) { }
+
+    void f1cast(Object o) {
+        Object l;
+        l = (@TB Outer) o;
+        l = (@TB Outer.Inner) o;
+        l = (Outer. @TC Inner) o;
+        l = (@TB Outer. @TC Inner) o;
     }
 
-    List<@A Outer.Inner> f2;
-    List<@A Outer.Inner> f2r() { return null; }
-    void f2p(List<@A Outer.Inner> p) { }
-    void f2c(Object o) {
-        Object l = (List<@A Outer.Inner>) o;
-    }
+    List<@TB Outer> g1;
+    List<@TB Outer.Inner> g1a;
+    List<Outer. @TC Inner> g1b;
+    List<@TB Outer. @TC Inner> g1c;
+
+    List<@TA Top. @TB Outer> g2;
+    List<@TA Top. @TB Outer.Inner> g2a;
+    List<@TA Top. Outer. @TC Inner> g2b;
+    List<@TA Top. @TB Outer. @TC Inner> g2c;
+
+    List<@TB Outer> g1r() { return null; }
+    List<@TB Outer.Inner> g1ra() { return null; }
+    List<Outer. @TC Inner> g1rb() { return null; }
+    List<@TB Outer. @TC Inner> g1rc() { return null; }
 
-    // OK:
-    @A Outer g1;
-    List<@A Outer> g2;
-    Outer. @A Inner g3;
-    List<Outer. @A Inner> g4;
+    void g1param(List<@TB Outer> p,
+            List<@TB Outer.Inner> p1,
+            List<Outer. @TC Inner> p2,
+            List<@TB Outer. @TC Inner> p3) { }
+
+    void g1new(Object o) {
+        Object l;
+        l = new @TB ArrayList<@TB Outer>();
+        l = new @TB ArrayList<@TB Outer.Inner>();
+        l = new @TB HashMap<String, Outer. @TC Inner>();
+        l = new @TB HashMap<String, @TB Outer. Inner>();
+        l = new @TB HashMap<String, @TB Outer. @TC Inner>();
+        l = new @TB HashMap<String, @TA Top. Outer. @TC Inner>();
+        l = new @TB HashMap<String, @TA Top. @TB Outer. Inner>();
+        l = new @TB HashMap<String, @TA Top. @TB Outer. @TC Inner>();
+    }
 }