8334466: Ambiguous method call with generics may cause FunctionDescriptorLookupError

Reviewed-by: jlahoda
This commit is contained in:
Vicente Romero 2024-08-12 13:52:57 +00:00
parent 89a15f1414
commit 61d1dc5953
3 changed files with 38 additions and 3 deletions

View File

@ -1219,9 +1219,17 @@ public class Resolve {
/** Parameters {@code t} and {@code s} are unrelated functional interface types. */
private boolean functionalInterfaceMostSpecific(Type t, Type s, JCTree tree) {
Type tDesc = types.findDescriptorType(types.capture(t));
Type tDescNoCapture = types.findDescriptorType(t);
Type sDesc = types.findDescriptorType(s);
Type tDesc;
Type tDescNoCapture;
Type sDesc;
try {
tDesc = types.findDescriptorType(types.capture(t));
tDescNoCapture = types.findDescriptorType(t);
sDesc = types.findDescriptorType(s);
} catch (Types.FunctionDescriptorLookupError ex) {
// don't report, a more meaningful error should be reported upstream
return false;
}
final List<Type> tTypeParams = tDesc.getTypeArguments();
final List<Type> tTypeParamsNoCapture = tDescNoCapture.getTypeArguments();
final List<Type> sTypeParams = sDesc.getTypeArguments();

View File

@ -0,0 +1,25 @@
/*
* @test /nodynamiccopyright/
* @bug 8334466
* @summary Ambiguous method call with generics may cause FunctionDescriptorLookupError
* @compile/fail/ref=CrashWithFunctionDescriptorLookupErrorTest.out -XDrawDiagnostics CrashWithFunctionDescriptorLookupErrorTest.java
*/
import java.util.List;
class CrashWithFunctionDescriptorLookupErrorTest {
void m() {
List<X> list = List.of(new X());
test(list.get(0));
}
void test(A<?> a) { }
void test(B<?> b) { }
interface A<T extends A<T>> { T a(); }
interface B<T extends B<T>> { T b(); }
class X implements A<X>, B<X> {
public X a() { return null; }
public X b() { return null; }
}
}

View File

@ -0,0 +1,2 @@
CrashWithFunctionDescriptorLookupErrorTest.java:13:9: compiler.err.ref.ambiguous: test, kindname.method, test(CrashWithFunctionDescriptorLookupErrorTest.A<?>), CrashWithFunctionDescriptorLookupErrorTest, kindname.method, test(CrashWithFunctionDescriptorLookupErrorTest.B<?>), CrashWithFunctionDescriptorLookupErrorTest
1 error