mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
6199153: Generic throws and overriding
Javac incorrectly rejects an uchecked overriding Reviewed-by: jjg
This commit is contained in:
parent
d8292cad05
commit
b2f97fc341
4 changed files with 84 additions and 19 deletions
|
@ -1043,7 +1043,7 @@ public class Check {
|
||||||
* @param thrown The list of thrown exceptions.
|
* @param thrown The list of thrown exceptions.
|
||||||
* @param handled The list of handled exceptions.
|
* @param handled The list of handled exceptions.
|
||||||
*/
|
*/
|
||||||
List<Type> unHandled(List<Type> thrown, List<Type> handled) {
|
List<Type> unhandled(List<Type> thrown, List<Type> handled) {
|
||||||
List<Type> unhandled = List.nil();
|
List<Type> unhandled = List.nil();
|
||||||
for (List<Type> l = thrown; l.nonEmpty(); l = l.tail)
|
for (List<Type> l = thrown; l.nonEmpty(); l = l.tail)
|
||||||
if (!isHandled(l.head, handled)) unhandled = unhandled.prepend(l.head);
|
if (!isHandled(l.head, handled)) unhandled = unhandled.prepend(l.head);
|
||||||
|
@ -1200,29 +1200,36 @@ public class Check {
|
||||||
m.owner.isSubClass(other.owner, types)) {
|
m.owner.isSubClass(other.owner, types)) {
|
||||||
// allow limited interoperability with covariant returns
|
// allow limited interoperability with covariant returns
|
||||||
} else {
|
} else {
|
||||||
typeError(TreeInfo.diagnosticPositionFor(m, tree),
|
log.error(TreeInfo.diagnosticPositionFor(m, tree),
|
||||||
diags.fragment("override.incompatible.ret",
|
"override.incompatible.ret",
|
||||||
cannotOverride(m, other)),
|
cannotOverride(m, other),
|
||||||
mtres, otres);
|
mtres, otres);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (overrideWarner.warned) {
|
} else if (overrideWarner.warned) {
|
||||||
warnUnchecked(TreeInfo.diagnosticPositionFor(m, tree),
|
warnUnchecked(TreeInfo.diagnosticPositionFor(m, tree),
|
||||||
"prob.found.req",
|
"override.unchecked.ret",
|
||||||
diags.fragment("override.unchecked.ret",
|
uncheckedOverrides(m, other),
|
||||||
uncheckedOverrides(m, other)),
|
|
||||||
mtres, otres);
|
mtres, otres);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error if overriding method throws an exception not reported
|
// Error if overriding method throws an exception not reported
|
||||||
// by overridden method.
|
// by overridden method.
|
||||||
List<Type> otthrown = types.subst(ot.getThrownTypes(), otvars, mtvars);
|
List<Type> otthrown = types.subst(ot.getThrownTypes(), otvars, mtvars);
|
||||||
List<Type> unhandled = unHandled(mt.getThrownTypes(), otthrown);
|
List<Type> unhandledErased = unhandled(mt.getThrownTypes(), types.erasure(otthrown));
|
||||||
if (unhandled.nonEmpty()) {
|
List<Type> unhandledUnerased = unhandled(mt.getThrownTypes(), otthrown);
|
||||||
|
if (unhandledErased.nonEmpty()) {
|
||||||
log.error(TreeInfo.diagnosticPositionFor(m, tree),
|
log.error(TreeInfo.diagnosticPositionFor(m, tree),
|
||||||
"override.meth.doesnt.throw",
|
"override.meth.doesnt.throw",
|
||||||
cannotOverride(m, other),
|
cannotOverride(m, other),
|
||||||
unhandled.head);
|
unhandledUnerased.head);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (unhandledUnerased.nonEmpty()) {
|
||||||
|
warnUnchecked(TreeInfo.diagnosticPositionFor(m, tree),
|
||||||
|
"override.unchecked.thrown",
|
||||||
|
cannotOverride(m, other),
|
||||||
|
unhandledUnerased.head);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1093,23 +1093,33 @@ compiler.misc.no.args=\
|
||||||
no arguments
|
no arguments
|
||||||
|
|
||||||
compiler.err.override.static=\
|
compiler.err.override.static=\
|
||||||
{0}; overriding method is static
|
{0}\n\
|
||||||
|
overriding method is static
|
||||||
compiler.err.override.meth=\
|
compiler.err.override.meth=\
|
||||||
{0}; overridden method is {1}
|
{0}\n\
|
||||||
|
overridden method is {1}
|
||||||
|
|
||||||
compiler.err.override.meth.doesnt.throw=\
|
compiler.err.override.meth.doesnt.throw=\
|
||||||
{0}; overridden method does not throw {1}
|
{0}\n\
|
||||||
|
overridden method does not throw {1}
|
||||||
|
|
||||||
# In the following string {1} is a space separated list of Java Keywords, as
|
# In the following string {1} is a space separated list of Java Keywords, as
|
||||||
# they would have been declared in the source code
|
# they would have been declared in the source code
|
||||||
compiler.err.override.weaker.access=\
|
compiler.err.override.weaker.access=\
|
||||||
{0}; attempting to assign weaker access privileges; was {1}
|
{0}\n\
|
||||||
|
attempting to assign weaker access privileges; was {1}
|
||||||
|
|
||||||
compiler.misc.override.incompatible.ret=\
|
compiler.err.override.incompatible.ret=\
|
||||||
{0}; attempting to use incompatible return type
|
{0}\n\
|
||||||
|
return type {1} is not compatible with {2}
|
||||||
|
|
||||||
compiler.misc.override.unchecked.ret=\
|
compiler.warn.override.unchecked.ret=\
|
||||||
{0}; return type requires unchecked conversion
|
[unchecked] {0}\n\
|
||||||
|
return type requires unchecked conversion from {1} to {2}
|
||||||
|
|
||||||
|
compiler.warn.override.unchecked.thrown=\
|
||||||
|
[unchecked] {0}\n\
|
||||||
|
overridden method does not throw {1}
|
||||||
|
|
||||||
## The following are all possible strings for the first argument ({0}) of the
|
## The following are all possible strings for the first argument ({0}) of the
|
||||||
## above strings.
|
## above strings.
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
||||||
|
* CA 95054 USA or visit www.sun.com if you need additional information or
|
||||||
|
* have any questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @bug 6199153
|
||||||
|
* @summary Generic throws and overriding
|
||||||
|
* @author mcimadamore
|
||||||
|
* @compile/fail/ref=T6199153.out -Xlint -Werror -XDrawDiagnostics T6199153.java
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
class T6199153 {
|
||||||
|
|
||||||
|
static class A {
|
||||||
|
public <T extends IOException> void m() throws T {}
|
||||||
|
}
|
||||||
|
|
||||||
|
static class B extends A {
|
||||||
|
public void m() throws IOException {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
T6199153.java:41:21: compiler.warn.override.unchecked.thrown: (compiler.misc.cant.override: m(), T6199153.B, <T>m(), T6199153.A), java.io.IOException
|
||||||
|
- compiler.err.warnings.and.werror
|
||||||
|
1 error
|
||||||
|
1 warning
|
Loading…
Add table
Add a link
Reference in a new issue