# HG changeset patch # User cushon # Date 1528751210 25200 # Node ID 7c5fbc9531218f573247f76079902e3559bb01f5 # Parent a18c605271667ab51fa03fa6fbe261ee056f529a 8203679: AssertionError in DeferredAttr with parenthesized method reference Reviewed-by: mcimadamore diff -r a18c60527166 -r 7c5fbc953121 src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Tue Jun 12 18:12:59 2018 -0400 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/DeferredAttr.java Mon Jun 11 14:06:50 2018 -0700 @@ -164,11 +164,18 @@ JCMemberReference result = new JCMemberReference(t.mode, t.name, expr, typeargs) { @Override public void setOverloadKind(OverloadKind overloadKind) { - super.setOverloadKind(overloadKind); - if (t.getOverloadKind() == null) { + OverloadKind previous = t.getOverloadKind(); + if (previous == null) { t.setOverloadKind(overloadKind); + } else { + Assert.check(previous == overloadKind); } } + + @Override + public OverloadKind getOverloadKind() { + return t.getOverloadKind(); + } }; result.pos = t.pos; return result; diff -r a18c60527166 -r 7c5fbc953121 test/langtools/tools/javac/lambda/methodReference/MethodRefStuckParenthesized.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/lambda/methodReference/MethodRefStuckParenthesized.java Mon Jun 11 14:06:50 2018 -0700 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2018, Google LLC. 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 8203679 + * @summary This is a negative regression test for an AssertionError in DeferredAttr. + * @compile/fail/ref=MethodRefStuckParenthesized.out -XDrawDiagnostics MethodRefStuckParenthesized.java + */ + +public abstract class MethodRefStuckParenthesized { + + interface I { + String v(); + } + + interface J { + String v(); + } + + abstract String v(); + + abstract void f(I v); + + abstract J g(X x); + + void test() { + f(g((this::v))); + } +} diff -r a18c60527166 -r 7c5fbc953121 test/langtools/tools/javac/lambda/methodReference/MethodRefStuckParenthesized.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/langtools/tools/javac/lambda/methodReference/MethodRefStuckParenthesized.out Mon Jun 11 14:06:50 2018 -0700 @@ -0,0 +1,2 @@ +MethodRefStuckParenthesized.java:48:5: compiler.err.cant.apply.symbol: kindname.method, f, MethodRefStuckParenthesized.I, MethodRefStuckParenthesized.J, kindname.class, MethodRefStuckParenthesized, (compiler.misc.no.conforming.assignment.exists: (compiler.misc.infer.no.conforming.instance.exists: X, MethodRefStuckParenthesized.J, MethodRefStuckParenthesized.I)) +1 error