diff --git a/checker/tests/nullness/Issue6635.java b/checker/tests/nullness/Issue6635.java new file mode 100644 index 00000000000..f4bda6af07c --- /dev/null +++ b/checker/tests/nullness/Issue6635.java @@ -0,0 +1,27 @@ +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; + +public class Issue6635 { + @FunctionalInterface + public interface ThrowingRunnable { + void run() throws X; + } + + @FunctionalInterface + public interface ThrowingConsumer { + void accept(T t) throws X; + } + + public static ThrowingRunnable closing(@Nullable AutoCloseable resource) { + return disposing(resource, AutoCloseable::close); + } + + public static ThrowingRunnable disposing( + @Nullable T resource, ThrowingConsumer disposer) { + return () -> { + if (resource != null) { + disposer.accept(resource); + } + }; + } +} diff --git a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceFactory.java b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceFactory.java index f21b0c89511..62877ee413c 100644 --- a/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceFactory.java +++ b/framework/src/main/java/org/checkerframework/framework/util/typeinference8/types/InferenceFactory.java @@ -977,7 +977,12 @@ public ConstraintSet getCheckedExceptionConstraints( if (ei.isProper()) { properTypes.add((ProperType) ei); } else { - es.add((UseOfVariable) ei); + UseOfVariable varEi = (UseOfVariable) ei; + if (varEi.getVariable().getInstantiation() != null) { + properTypes.add(varEi.getVariable().getInstantiation()); + } else { + es.add((UseOfVariable) ei); + } } } if (es.isEmpty()) {