blob: 59f00591ea2f6791e091bb576796d02fa1d4e221 [file] [log] [blame]
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) {}
}
}