Mercurial > hg > openjdk > jdk9 > langtools
changeset 4065:6d160fbd7d2e
8177097: Generic method reference returning wildcard parameterized type does not compile
Summary: Captured cache should not be used during 'fake' attr checks
Reviewed-by: vromero, jjg
author | mcimadamore |
---|---|
date | Fri, 24 Mar 2017 13:04:32 +0000 |
parents | b398971f7b6f |
children | 24582dd2649a |
files | src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java test/tools/javac/generics/inference/8177097/T8177097a.java test/tools/javac/generics/inference/8177097/T8177097b.java |
diffstat | 4 files changed, 111 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Mar 24 12:33:29 2017 +0000 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Mar 24 13:04:32 2017 +0000 @@ -448,13 +448,21 @@ NORMAL, - NO_TREE_UPDATE { // Mode signalling 'fake check' - skip tree update + /** + * Mode signalling 'fake check' - skip tree update. A side-effect of this mode is + * that the captured var cache in {@code InferenceContext} will be used in read-only + * mode when performing inference checks. + */ + NO_TREE_UPDATE { @Override public boolean updateTreeType() { return false; } }, - NO_INFERENCE_HOOK { // Mode signalling that caller will manage free types in tree decorations. + /** + * Mode signalling that caller will manage free types in tree decorations. + */ + NO_INFERENCE_HOOK { @Override public boolean installPostInferenceHook() { return false; @@ -3769,7 +3777,7 @@ break; case MTH: { owntype = checkMethod(site, sym, - new ResultInfo(resultInfo.pkind, resultInfo.pt.getReturnType(), resultInfo.checkContext), + new ResultInfo(resultInfo.pkind, resultInfo.pt.getReturnType(), resultInfo.checkContext, resultInfo.checkMode), env, TreeInfo.args(env.tree), resultInfo.pt.getParameterTypes(), resultInfo.pt.getTypeArguments()); break;
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Fri Mar 24 12:33:29 2017 +0000 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Infer.java Fri Mar 24 13:04:32 2017 +0000 @@ -27,6 +27,7 @@ import com.sun.tools.javac.code.Type.UndetVar.UndetVarListener; import com.sun.tools.javac.code.Types.TypeMapping; +import com.sun.tools.javac.comp.Attr.CheckMode; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCTypeCast; import com.sun.tools.javac.tree.TreeInfo; @@ -419,7 +420,7 @@ } } else if (rsInfoInfContext.free(resultInfo.pt)) { //propagation - cache captured vars - qtype = inferenceContext.asUndetVar(rsInfoInfContext.cachedCapture(tree, from, false)); + qtype = inferenceContext.asUndetVar(rsInfoInfContext.cachedCapture(tree, from, !resultInfo.checkMode.updateTreeType())); } Assert.check(allowGraphInference || !rsInfoInfContext.free(to), "legacy inference engine cannot handle constraints on both sides of a subtyping assertion"); @@ -509,7 +510,7 @@ inferenceContext.solve(List.of(from.qtype), new Warner()); inferenceContext.notifyChange(); Type capturedType = resultInfo.checkContext.inferenceContext() - .cachedCapture(tree, from.getInst(), false); + .cachedCapture(tree, from.getInst(), !resultInfo.checkMode.updateTreeType()); if (types.isConvertible(capturedType, resultInfo.checkContext.inferenceContext().asUndetVar(to))) { //effectively skip additional return-type constraint generation (compatibility)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/inference/8177097/T8177097a.java Fri Mar 24 13:04:32 2017 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8177097 + * @summary Generic method reference returning wildcard parameterized type does not compile + * @compile T8177097a.java + */ + +import java.util.Map; + +class T8177097a { + interface X<O> { + Map<?, O> apply(); + } + + <O> void go(X<O> x) { } + + static <I> Map<?, Integer> a() { + return null; + } + + void test() { + go(T8177097a::a); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/generics/inference/8177097/T8177097b.java Fri Mar 24 13:04:32 2017 +0000 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8177097 + * @summary Generic method reference returning wildcard parameterized type does not compile + * @compile T8177097b.java + */ + +import java.util.Map; + +class T8177097b { + interface X<O> { + O apply(Class<Map<Integer, ?>> m2); + } + + <O> void go(X<O> x) {} + + static <I> I a(Class<I> c) { return null; } + + + void test() { + go(T8177097b::a); + } +}