blob: 92e3179148727c0a434c7c570b507623770187c0 [file] [log] [blame]
// Test case for Issue 1797:
// https://github.com/typetools/checker-framework/issues/1797
import org.checkerframework.checker.nullness.qual.Nullable;
public class Issue1797 {
void fooReturn(@Nullable Object o) {
try {
return;
} finally {
if (o != null) {
o.toString();
}
}
}
void fooWhileReturn(@Nullable Object o) {
while (this.hashCode() < 5) {
try {
return;
} finally {
if (o != null) {
o.toString();
}
}
}
}
void fooReturnNested(@Nullable Object o) {
while (this.hashCode() < 10) {
while (this.hashCode() < 5) {
try {
return;
} finally {
if (o != null) {
o.toString();
}
// go to exit, not either loop
}
}
}
}
void fooBreak(@Nullable Object o) {
while (this.hashCode() < 5) {
try {
break;
} finally {
if (o != null) {
o.toString();
}
}
}
}
void fooBreakLabel(@Nullable Object o) {
outer:
while (this.hashCode() < 10) {
while (this.hashCode() < 5) {
try {
break outer;
} finally {
if (o != null) {
o.toString();
}
// continue after outer
}
}
}
}
void fooBreakLabel2(@Nullable Object o) {
outer:
while (this.hashCode() < 10) {
try {
inner:
while (this.hashCode() < 5) {
if (this.hashCode() < 2) {
break outer;
// go to finally
} else {
break inner;
// do not go to finally
}
}
} finally {
if (o != null) {
o.toString();
}
// continue either at outer or after outer
}
}
}
void fooBreakNoLabel(@Nullable Object o) {
outer:
while (this.hashCode() < 10) {
inner:
while (this.hashCode() < 5) {
try {
break;
} finally {
if (o != null) {
o.toString();
}
// continue at outer
}
}
}
}
void fooContinue(@Nullable Object o) {
while (this.hashCode() < 5) {
try {
continue;
} finally {
if (o != null) {
o.toString();
}
}
}
}
void fooContinueLabel(@Nullable Object o) {
outer:
while (this.hashCode() < 10) {
while (this.hashCode() < 5) {
try {
continue outer;
} finally {
if (o != null) {
o.toString();
}
}
}
}
}
void fooSwitch(@Nullable Object o) {
switch (this.hashCode()) {
case 1:
try {
break;
} finally {
if (o != null) {
o.toString();
}
}
default:
}
}
// A few tests to make sure also return with expression works.
int barReturn(@Nullable Object o) {
try {
return 5;
} finally {
if (o != null) {
o.toString();
}
}
}
int barReturnInFinally(@Nullable Object o) {
try {
return 5;
} finally {
if (o != null) {
o.toString();
}
return 10;
}
}
int barReturnNested(@Nullable Object o) {
while (this.hashCode() < 10) {
while (this.hashCode() < 5) {
try {
return 5;
} finally {
if (o != null) {
o.toString();
}
// goes to return 5, not either loop!
}
}
}
return 10;
}
@FunctionalInterface
interface NullableParamFunction {
String takeVal(@Nullable Object x);
}
void testLambda() {
NullableParamFunction n1 = (@Nullable Object x) -> (x == null) ? "null" : x.toString();
try {
NullableParamFunction n2 = (@Nullable Object x) -> (x == null) ? "null" : x.toString();
} finally {
NullableParamFunction n3 = (x) -> (x == null) ? "null" : x.toString();
}
}
boolean nestedCFGConstructionTest(@Nullable Object o) {
boolean result = true;
java.io.BufferedWriter out = null;
try {
try {
} finally {
out = new java.io.BufferedWriter(new java.io.OutputStreamWriter(System.err));
}
if (o != null) {
o.toString();
out.write(' ');
}
} catch (Exception e) {
} finally {
}
return result;
}
void nestedTryFinally() {
try {
try {
} finally {
}
} finally {
}
}
boolean nestedCFGConstructionTest2() throws java.io.IOException {
java.io.BufferedWriter out =
new java.io.BufferedWriter(new java.io.OutputStreamWriter(System.err));
try {
try {
return true;
} finally {
}
} finally {
out.write(' ');
out.close();
}
}
void nestedTryFinally2(java.io.BufferedWriter out) throws java.io.IOException {
try {
try {
return;
} finally {
}
} finally {
out.write(' ');
out.close();
}
}
}