# HG changeset patch # User vromero # Date 1472066590 25200 # Node ID 8843f886a89f470206b2a324b324d2dc2fbdf011 # Parent 622fb23d992ecf53c6bac7e24b90155de6259ee7 8047338: javac is not correctly filtering non-members methods to obtain the function descriptor Reviewed-by: mcimadamore diff -r 622fb23d992e -r 8843f886a89f langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Tue Aug 23 10:19:49 2016 +0100 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Types.java Wed Aug 24 12:23:10 2016 -0700 @@ -418,10 +418,15 @@ final ListBuffer abstracts = new ListBuffer<>(); for (Symbol sym : membersCache.getSymbols(new DescriptorFilter(origin))) { Type mtype = memberType(origin.type, sym); - if (abstracts.isEmpty() || - (sym.name == abstracts.first().name && + if (abstracts.isEmpty()) { + abstracts.append(sym); + } else if ((sym.name == abstracts.first().name && overrideEquivalent(mtype, memberType(origin.type, abstracts.first())))) { - abstracts.append(sym); + if (!abstracts.stream().filter(msym -> msym.owner.isSubClass(sym.enclClass(), Types.this)) + .map(msym -> memberType(origin.type, msym)) + .anyMatch(abstractMType -> isSubSignature(abstractMType, mtype))) { + abstracts.append(sym); + } } else { //the target method(s) should be the only abstract members of t throw failure("not.a.functional.intf.1", origin, diff -r 622fb23d992e -r 8843f886a89f langtools/test/tools/javac/T8047338/FilterNonMembersToObtainFunctionDescriptorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T8047338/FilterNonMembersToObtainFunctionDescriptorTest.java Wed Aug 24 12:23:10 2016 -0700 @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016, 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 8047338 + * @summary javac is not correctly filtering non-members methods to obtain the function descriptor + * @compile FilterNonMembersToObtainFunctionDescriptorTest.java + */ + +public class FilterNonMembersToObtainFunctionDescriptorTest { + V fails(CallableFail callable) throws E { + return null; + } + + V failsSub(CallableFailSub callable) throws E { + return null; + } + + void m() throws Exception { + fails((String s) -> 2); + failsSub((String s) -> 2); + } + + interface Callable { + V callFail(String s) throws Exception; + } + + interface CallableFail extends Callable { + @Override + V callFail(String s) throws E; + } + + interface CallableFailSub extends CallableFail {} +}