blob: 92befa91cf818e90b3408773cbb3300fd66641c7 [file] [log] [blame]
import java.util.List;
import org.checkerframework.checker.guieffect.qual.AlwaysSafe;
import org.checkerframework.checker.guieffect.qual.PolyUIType;
import org.checkerframework.checker.guieffect.qual.UI;
public class ThrowCatchTest {
// Default type of List's type parameter is below @UI so these
// fields are type.argument.incompatible
// :: error: (type.argument)
List<? extends @UI Object> ooo;
// :: error: (type.argument) :: error: (annotations.on.use)
List<? extends @UI Inner> iii;
class Inner {}
boolean flag = true;
// Type var test
<E extends @UI PolyUIException> void throwTypeVarUI1(E ex1, @UI E ex2) throws PolyUIException {
if (flag) {
// :: error: (throw)
throw ex1;
}
// :: error: (throw)
throw ex2;
}
<@UI E extends @UI PolyUIException> void throwTypeVarUI2(E ex1) throws PolyUIException {
// :: error: (throw)
throw ex1;
}
<E extends @AlwaysSafe PolyUIException> void throwTypeVarAlwaysSafe1(E ex1, @AlwaysSafe E ex2)
throws PolyUIException {
if (flag) {
throw ex1;
}
throw ex2;
}
<@AlwaysSafe E extends PolyUIException> void throwTypeVarAlwaysSafe2(E ex1, @AlwaysSafe E ex2)
throws PolyUIException {
if (flag) {
throw ex1;
}
throw ex2;
}
<@AlwaysSafe E extends @UI PolyUIException> void throwTypeVarMixed(E ex1, @AlwaysSafe E ex2)
throws PolyUIException {
if (flag) {
// :: error: (throw)
throw ex1;
}
throw ex2;
}
// Wildcards
void throwWildcard(
// :: error: (type.argument)
List<? extends @UI PolyUIException>
ui, // Default type of List's type parameter is below @UI so this is
// type.argument.incompatible
List<? extends @AlwaysSafe PolyUIException> alwaysSafe)
throws PolyUIException {
if (flag) {
// :: error: (throw)
throw ui.get(0);
}
throw alwaysSafe.get(0);
}
void throwNull() {
throw null;
}
// Declared
@UI PolyUIException ui = new PolyUIException();
@AlwaysSafe PolyUIException alwaysSafe = new PolyUIException();
void throwDeclared() {
try {
// :: error: (throw)
throw ui;
} catch (@UI PolyUIException UIParam) {
}
try {
throw alwaysSafe;
} catch (@AlwaysSafe PolyUIException alwaysSafeParam) {
}
}
// Test Exception parameters
void unionTypes() {
try {
} catch (
@AlwaysSafe NullPointerPolyUIException
| @AlwaysSafe ArrayStorePolyUIException unionParam) {
}
try {
} catch (@UI NullPointerPolyUIException | @UI ArrayStorePolyUIException unionParam) {
}
}
void defaults() {
try {
throw new PolyUIException();
} catch (PolyUIException e) {
}
}
@PolyUIType
class PolyUIException extends Exception {}
@PolyUIType
class NullPointerPolyUIException extends NullPointerException {}
@PolyUIType
class ArrayStorePolyUIException extends ArrayStoreException {}
}