8207224: Javac compiles source code despite illegal use of unchecked conversions

Reviewed-by: mcimadamore, darcy
This commit is contained in:
Vicente Romero 2018-12-18 16:22:46 -05:00
parent cc65367331
commit 8b6b63b38b
4 changed files with 41 additions and 3 deletions

View File

@ -189,7 +189,8 @@ public enum Source {
SWITCH_MULTIPLE_CASE_LABELS(JDK13, Fragments.FeatureMultipleCaseLabels, DiagKind.PLURAL),
SWITCH_RULE(JDK13, Fragments.FeatureSwitchRules, DiagKind.PLURAL),
SWITCH_EXPRESSION(JDK13, Fragments.FeatureSwitchExpressions, DiagKind.PLURAL),
RAW_STRING_LITERALS(JDK13, Fragments.FeatureRawStringLiterals, DiagKind.PLURAL);
RAW_STRING_LITERALS(JDK13, Fragments.FeatureRawStringLiterals, DiagKind.PLURAL),
RETURN_TYPE_SUBSTITUTABLE_SAME_TYPE(JDK13);
enum DiagKind {
NORMAL,

View File

@ -91,6 +91,7 @@ public class Types {
final Names names;
final boolean allowDefaultMethods;
final boolean mapCapturesToBounds;
final boolean returnTypeSustitutableSameType;
final Check chk;
final Enter enter;
JCDiagnostic.Factory diags;
@ -114,6 +115,7 @@ public class Types {
Source source = Source.instance(context);
allowDefaultMethods = Feature.DEFAULT_METHODS.allowedInSource(source);
mapCapturesToBounds = Feature.MAP_CAPTURES_TO_BOUNDS.allowedInSource(source);
returnTypeSustitutableSameType = Feature.RETURN_TYPE_SUBSTITUTABLE_SAME_TYPE.allowedInSource(source);
chk = Check.instance(context);
enter = Enter.instance(context);
capturedName = names.fromString("<captured wildcard>");
@ -4235,8 +4237,13 @@ public class Types {
return covariantReturnType(r1.getReturnType(), r2res, warner);
if (isSubtypeUnchecked(r1.getReturnType(), r2res, warner))
return true;
if (!isSubtype(r1.getReturnType(), erasure(r2res)))
return false;
if (returnTypeSustitutableSameType) {
if (!isSameType(r1.getReturnType(), erasure(r2res)))
return false;
} else {
if (!isSubtype(r1.getReturnType(), erasure(r2res)))
return false;
}
warner.warn(LintCategory.UNCHECKED);
return true;
}

View File

@ -0,0 +1,28 @@
/*
* @test /nodynamiccopyright/
* @bug 8207224
* @summary Javac compiles source code despite illegal use of unchecked conversions
* @compile/fail/ref=ReturnTypeSubstitutableTest.out -XDrawDiagnostics ReturnTypeSubstitutableTest.java
* @compile -source 12 ReturnTypeSubstitutableTest.java
*/
class ReturnTypeSubstitutableTest {
abstract class AbstractDemo<Request extends AbstractResult, Response extends AbstractResult> {
protected abstract Response test(Request request);
}
abstract interface AbstractResult {}
abstract interface SimpleResult extends AbstractResult {}
class Result1 implements SimpleResult {}
class OtherResult implements AbstractResult {}
public class SimpleDemo<Request extends AbstractResult, Response extends AbstractResult> extends AbstractDemo<Request, Response> {
@Override
protected SimpleResult test(AbstractResult request) {
return null;
}
}
}

View File

@ -0,0 +1,2 @@
ReturnTypeSubstitutableTest.java:24:32: compiler.err.override.incompatible.ret: (compiler.misc.cant.override: test(ReturnTypeSubstitutableTest.AbstractResult), ReturnTypeSubstitutableTest.SimpleDemo, test(Request), ReturnTypeSubstitutableTest.AbstractDemo), ReturnTypeSubstitutableTest.SimpleResult, Response
1 error