langtools/test/tools/javac/annotations/typeAnnotations/failures/CantAnnotateStaticClass.java
--- 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>();
+ }
}