| import org.checkerframework.framework.testchecker.h1h2checker.quals.*; |
| |
| public class Generics { |
| |
| class Generics1<T extends @H1Top @H2Top Object> { |
| |
| T m(@H1S2 @H2S2 T p) { |
| T l = p; |
| // :: error: (return) |
| return l; |
| } |
| |
| void unsound(Generics1<@H1S1 @H2S1 Object> p, @H1S2 @H2S2 Object p2) { |
| @H1S1 @H2S1 Object o = p.m(p2); |
| } |
| } |
| |
| class Generics2<T extends @H1Top Object> { |
| |
| T m(@H1S2 T p) { |
| T l = p; |
| // :: error: (return) |
| return l; |
| } |
| |
| void unsound(Generics2<@H1S1 Object> p, @H1S2 Object p2) { |
| @H1S1 Object o = p.m(p2); |
| } |
| } |
| |
| class Generics3<T extends @H1S1 Object> { |
| |
| // See comments in BaseTypeVisitor about type variable checks. |
| // The currently desired behavior is that the annotation on the |
| // type variable overrides the bound. |
| // TODO?:: error: (type.invalid) |
| void m(@H1S2 T p) {} |
| } |
| } |