mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-13 03:45:19 +00:00
8014494: javac crashes when varargs element of a method reference is inferred from the context
Varargs element is not refreshed after type-inference Reviewed-by: jjg, vromero
This commit is contained in:
parent
9d588c1a23
commit
d176f2abdf
@ -3732,7 +3732,7 @@ public class Attr extends JCTree.Visitor {
|
||||
noteWarner);
|
||||
|
||||
return chk.checkMethod(owntype, sym, env, argtrees, argtypes, env.info.lastResolveVarargs(),
|
||||
noteWarner.hasNonSilentLint(LintCategory.UNCHECKED));
|
||||
noteWarner.hasNonSilentLint(LintCategory.UNCHECKED), resultInfo.checkContext.inferenceContext());
|
||||
} catch (Infer.InferenceException ex) {
|
||||
//invalid target type - propagate exception outwards or report error
|
||||
//depending on the current check context
|
||||
|
||||
@ -853,7 +853,8 @@ public class Check {
|
||||
final List<JCExpression> argtrees,
|
||||
List<Type> argtypes,
|
||||
boolean useVarargs,
|
||||
boolean unchecked) {
|
||||
boolean unchecked,
|
||||
InferenceContext inferenceContext) {
|
||||
// System.out.println("call : " + env.tree);
|
||||
// System.out.println("method : " + owntype);
|
||||
// System.out.println("actuals: " + argtypes);
|
||||
@ -917,7 +918,7 @@ public class Check {
|
||||
argtype);
|
||||
}
|
||||
if (!((MethodSymbol)sym.baseSymbol()).isSignaturePolymorphic(types)) {
|
||||
TreeInfo.setVarargsElement(env.tree, types.elemtype(argtype));
|
||||
setVarargsElement(env, types.elemtype(argtype), inferenceContext);
|
||||
}
|
||||
}
|
||||
PolyKind pkind = (sym.type.hasTag(FORALL) &&
|
||||
@ -927,6 +928,17 @@ public class Check {
|
||||
return owntype;
|
||||
}
|
||||
//where
|
||||
private void setVarargsElement(final Env<AttrContext> env, final Type elemtype, InferenceContext inferenceContext) {
|
||||
if (inferenceContext.free(elemtype)) {
|
||||
inferenceContext.addFreeTypeListener(List.of(elemtype), new FreeTypeListener() {
|
||||
public void typesInferred(InferenceContext inferenceContext) {
|
||||
setVarargsElement(env, inferenceContext.asInstType(elemtype), inferenceContext);
|
||||
}
|
||||
});
|
||||
}
|
||||
TreeInfo.setVarargsElement(env.tree, elemtype);
|
||||
}
|
||||
|
||||
private void assertConvertible(JCTree tree, Type actual, Type formal, Warner warn) {
|
||||
if (types.isConvertible(actual, formal, warn))
|
||||
return;
|
||||
|
||||
47
langtools/test/tools/javac/lambda/TargetType73.java
Normal file
47
langtools/test/tools/javac/lambda/TargetType73.java
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (c) 2013, 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.
|
||||
*
|
||||
* 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 8014494
|
||||
* @summary javac crashes when varargs element of a method reference is inferred from the context
|
||||
* @compile TargetType73.java
|
||||
*/
|
||||
import java.util.List;
|
||||
|
||||
class TargetType73 {
|
||||
|
||||
interface Function<X,Y> {
|
||||
Y m(X x);
|
||||
}
|
||||
|
||||
static void test() {
|
||||
m(TargetType73::g);
|
||||
}
|
||||
|
||||
public static <T> List<T> g(T... a) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static <C> void m(Function<String, C> zipper) { }
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user