JDK-8023558 : Javac creates invalid bootstrap methods for complex lambda/methodref case
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • Submitted: 2013-08-22
  • Updated: 2018-11-09
  • Resolved: 2013-09-12
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 8
8 b108Fixed
Related Reports
Duplicate :  
Relates :  
Relates :  
Description
Still not sure whose fault is it, either javac creates invalid bootstrap methods or this is runtime problem. Feel free to forward it to appropriate area.

Minimized testcase: 

interface SAM<T> {
    T get();
}

public class Test {
    public static void main(String[] args) {
        SAM<SAM> sam = () -> Object::new;
        SAM temp = sam.get()::get;
    }
}

Exception in thread "main" java.lang.BootstrapMethodError: call site initialization exception
	at java.lang.invoke.CallSite.makeSite(CallSite.java:298)
	at java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:294)
	at Test.main(Test.java:8)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:491)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.invoke.LambdaConversionException: Invalid receiver type class java.lang.Object; not a subtype of implementation type interface SAM
	at java.lang.invoke.AbstractValidatingLambdaMetafactory.validateMetafactoryArgs(AbstractValidatingLambdaMetafactory.java:225)
	at java.lang.invoke.LambdaMetafactory.metafactory(LambdaMetafactory.java:214)
	at java.lang.invoke.CallSite.makeSite(CallSite.java:283)
	... 7 more
Comments
for aurora: lang/LMBD/lmbd079/lmbd07901m0/lmbd07901m0 lang/LMBD/lmbd079/lmbd07901m0/lmbd07901m0_rt lang/LMBD/lmbd079/lmbd07901m001/lmbd07901m001 lang/LMBD/lmbd079/lmbd07901m001/lmbd07901m001_rt lang/LMBD/lmbd079/lmbd07901m002/lmbd07901m002 lang/LMBD/lmbd079/lmbd07901m002/lmbd07901m002_rt lang/LMBD/lmbd079/lmbd07901m01/lmbd07901m01 lang/LMBD/lmbd079/lmbd07901m01/lmbd07901m01_rt lang/LMBD/lmbd079/lmbd07901m011/lmbd07901m011 lang/LMBD/lmbd079/lmbd07901m011/lmbd07901m011_rt lang/LMBD/lmbd079/lmbd07901m012/lmbd07901m012 lang/LMBD/lmbd079/lmbd07901m012/lmbd07901m012_rt lang/LMBD/lmbd079/lmbd07901m1/lmbd07901m1 lang/LMBD/lmbd079/lmbd07901m1/lmbd07901m1_rt lang/LMBD/lmbd079/lmbd07901m101/lmbd07901m101 lang/LMBD/lmbd079/lmbd07901m101/lmbd07901m101_rt lang/LMBD/lmbd079/lmbd07901m102/lmbd07901m102 lang/LMBD/lmbd079/lmbd07901m102/lmbd07901m102_rt lang/LMBD/lmbd079/lmbd07901m11/lmbd07901m11 lang/LMBD/lmbd079/lmbd07901m11/lmbd07901m11_rt lang/LMBD/lmbd079/lmbd07901m111/lmbd07901m111 lang/LMBD/lmbd079/lmbd07901m111/lmbd07901m111_rt lang/LMBD/lmbd079/lmbd07901m112/lmbd07901m112 lang/LMBD/lmbd079/lmbd07901m112/lmbd07901m112_rt lang/LMBD/lmbd079/lmbd07901m2/lmbd07901m2 lang/LMBD/lmbd079/lmbd07901m2/lmbd07901m2_rt lang/LMBD/lmbd079/lmbd07901m201/lmbd07901m201 lang/LMBD/lmbd079/lmbd07901m201/lmbd07901m201_rt lang/LMBD/lmbd079/lmbd07901m202/lmbd07901m202 lang/LMBD/lmbd079/lmbd07901m202/lmbd07901m202_rt lang/LMBD/lmbd079/lmbd07901m21/lmbd07901m21 lang/LMBD/lmbd079/lmbd07901m21/lmbd07901m21_rt lang/LMBD/lmbd079/lmbd07901m211/lmbd07901m211 lang/LMBD/lmbd079/lmbd07901m211/lmbd07901m211_rt lang/LMBD/lmbd079/lmbd07901m212/lmbd07901m212 lang/LMBD/lmbd079/lmbd07901m212/lmbd07901m212_rt lang/LMBD/lmbd079/lmbd07901m3/lmbd07901m3 lang/LMBD/lmbd079/lmbd07901m3/lmbd07901m3_rt lang/LMBD/lmbd079/lmbd07901m301/lmbd07901m301 lang/LMBD/lmbd079/lmbd07901m301/lmbd07901m301_rt lang/LMBD/lmbd079/lmbd07901m302/lmbd07901m302 lang/LMBD/lmbd079/lmbd07901m302/lmbd07901m302_rt lang/LMBD/lmbd079/lmbd07901m31/lmbd07901m31 lang/LMBD/lmbd079/lmbd07901m31/lmbd07901m31_rt lang/LMBD/lmbd079/lmbd07901m311/lmbd07901m311 lang/LMBD/lmbd079/lmbd07901m311/lmbd07901m311_rt lang/LMBD/lmbd079/lmbd07901m312/lmbd07901m312 lang/LMBD/lmbd079/lmbd07901m312/lmbd07901m312_rt lang/LMBD/lmbd079/lmbd07901m4/lmbd07901m4 lang/LMBD/lmbd079/lmbd07901m4/lmbd07901m4_rt lang/LMBD/lmbd079/lmbd07901m401/lmbd07901m401 lang/LMBD/lmbd079/lmbd07901m401/lmbd07901m401_rt lang/LMBD/lmbd079/lmbd07901m402/lmbd07901m402 lang/LMBD/lmbd079/lmbd07901m402/lmbd07901m402_rt lang/LMBD/lmbd079/lmbd07901m41/lmbd07901m41 lang/LMBD/lmbd079/lmbd07901m41/lmbd07901m41_rt lang/LMBD/lmbd079/lmbd07901m411/lmbd07901m411 lang/LMBD/lmbd079/lmbd07901m411/lmbd07901m411_rt lang/LMBD/lmbd079/lmbd07901m412/lmbd07901m412 lang/LMBD/lmbd079/lmbd07901m412/lmbd07901m412_rt lang/LMBD/lmbd079/lmbd07901m5/lmbd07901m5 lang/LMBD/lmbd079/lmbd07901m5/lmbd07901m5_rt lang/LMBD/lmbd079/lmbd07901m501/lmbd07901m501 lang/LMBD/lmbd079/lmbd07901m501/lmbd07901m501_rt lang/LMBD/lmbd079/lmbd07901m502/lmbd07901m502 lang/LMBD/lmbd079/lmbd07901m502/lmbd07901m502_rt lang/LMBD/lmbd079/lmbd07901m51/lmbd07901m51 lang/LMBD/lmbd079/lmbd07901m51/lmbd07901m51_rt lang/LMBD/lmbd079/lmbd07901m511/lmbd07901m511 lang/LMBD/lmbd079/lmbd07901m511/lmbd07901m511_rt lang/LMBD/lmbd079/lmbd07901m512/lmbd07901m512 lang/LMBD/lmbd079/lmbd07901m512/lmbd07901m512_rt lang/LMBD/lmbd079/lmbd07901m6/lmbd07901m6 lang/LMBD/lmbd079/lmbd07901m6/lmbd07901m6_rt lang/LMBD/lmbd079/lmbd07901m601/lmbd07901m601 lang/LMBD/lmbd079/lmbd07901m601/lmbd07901m601_rt lang/LMBD/lmbd079/lmbd07901m602/lmbd07901m602 lang/LMBD/lmbd079/lmbd07901m602/lmbd07901m602_rt lang/LMBD/lmbd079/lmbd07901m61/lmbd07901m61 lang/LMBD/lmbd079/lmbd07901m61/lmbd07901m61_rt lang/LMBD/lmbd079/lmbd07901m611/lmbd07901m611 lang/LMBD/lmbd079/lmbd07901m611/lmbd07901m611_rt lang/LMBD/lmbd079/lmbd07901m612/lmbd07901m612 lang/LMBD/lmbd079/lmbd07901m612/lmbd07901m612_rt lang/LMBD/lmbd079/lmbd07901m7/lmbd07901m7 lang/LMBD/lmbd079/lmbd07901m7/lmbd07901m7_rt lang/LMBD/lmbd079/lmbd07901m701/lmbd07901m701 lang/LMBD/lmbd079/lmbd07901m701/lmbd07901m701_rt lang/LMBD/lmbd079/lmbd07901m702/lmbd07901m702 lang/LMBD/lmbd079/lmbd07901m702/lmbd07901m702_rt lang/LMBD/lmbd079/lmbd07901m71/lmbd07901m71 lang/LMBD/lmbd079/lmbd07901m71/lmbd07901m71_rt lang/LMBD/lmbd079/lmbd07901m711/lmbd07901m711 lang/LMBD/lmbd079/lmbd07901m711/lmbd07901m711_rt lang/LMBD/lmbd079/lmbd07901m712/lmbd07901m712 lang/LMBD/lmbd079/lmbd07901m712/lmbd07901m712_rt lang/LMBD/lmbd079/lmbd07901m8/lmbd07901m8 lang/LMBD/lmbd079/lmbd07901m8/lmbd07901m8_rt lang/LMBD/lmbd079/lmbd07901m801/lmbd07901m801 lang/LMBD/lmbd079/lmbd07901m801/lmbd07901m801_rt lang/LMBD/lmbd079/lmbd07901m802/lmbd07901m802 lang/LMBD/lmbd079/lmbd07901m802/lmbd07901m802_rt lang/LMBD/lmbd079/lmbd07901m81/lmbd07901m81 lang/LMBD/lmbd079/lmbd07901m81/lmbd07901m81_rt lang/LMBD/lmbd079/lmbd07901m811/lmbd07901m811 lang/LMBD/lmbd079/lmbd07901m811/lmbd07901m811_rt lang/LMBD/lmbd079/lmbd07901m812/lmbd07901m812 lang/LMBD/lmbd079/lmbd07901m812/lmbd07901m812_rt lang/LMBD/lmbd079/lmbd07901m9/lmbd07901m9 lang/LMBD/lmbd079/lmbd07901m9/lmbd07901m9_rt lang/LMBD/lmbd079/lmbd07901m901/lmbd07901m901 lang/LMBD/lmbd079/lmbd07901m901/lmbd07901m901_rt lang/LMBD/lmbd079/lmbd07901m902/lmbd07901m902 lang/LMBD/lmbd079/lmbd07901m902/lmbd07901m902_rt lang/LMBD/lmbd079/lmbd07901m91/lmbd07901m91 lang/LMBD/lmbd079/lmbd07901m91/lmbd07901m91_rt lang/LMBD/lmbd079/lmbd07901m911/lmbd07901m911 lang/LMBD/lmbd079/lmbd07901m911/lmbd07901m911_rt lang/LMBD/lmbd079/lmbd07901m912/lmbd07901m912 lang/LMBD/lmbd079/lmbd07901m912/lmbd07901m912_rt
11-09-2013

Fixed in lambda repo: http://hg.openjdk.java.net/lambda/lambda/langtools/rev/a4b2be6ba7cf Robert please backport into JDK 8 TL
22-08-2013

I thought the first line is the same as: SAM<SAM<Object>> sam = () -> Object::new; so the return type of get method of sam should be SAM<Object>. Now method reference Object::new is fine with return type SAM<Object>. Once we call get method we get SAM<Object> and should be able to use ::get on it. If we transform everything but the last method reference to anonymous classes we should get: SAM<SAM> sam = new SAM<SAM>() { @Override public SAM get() { return new SAM() { @Override public Object get() { return new Object(); } }; } }; SAM temp = new SAM(){ public Object get(){ return new Object(); } }::get; //no error //or SAM temp = new SAM<SAM>() { @Override public SAM get() { return new SAM() { @Override public Object get() { return new Object(); } }; } }.get()::get; //no error // BTW if we use SAM temp = sam.get()::get; here we still get bootstrap error
22-08-2013

I also notice that the problem is caused by this: SAM temp = sam.get()::get; And not by the apparently more convoluted nested mref. This can be reproduced with the following: interface SAM<T> { T get(); } class Test { public static void main(String[] args) { SAM<SAM> sam = new SAM<SAM>() { public SAM get() { return null; } }; SAM temp = sam.get()::get; } } This has nothing to do with 292 - this is a missing cast in the method reference receiver - i.e. the erased receiver type is Object (erased type of sam.get()), but the static type of that expression is SAM. Compiler should put a cast in there, but the cast is missing as shown in javap: public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=3, args_size=1 0: new #2 // class Test$1 3: dup 4: invokespecial #3 // Method Test$1."<init>":()V 7: astore_1 8: aload_1 9: invokeinterface #4, 1 // InterfaceMethod SAM.get:()Ljava/lang/Object; 14: invokedynamic #5, 0 // InvokeDynamic #0:get:(Ljava/lang/Object;)LSAM; 19: astore_2 20: return LineNumberTable: line 1476: 0 line 1478: 8 line 1479: 20
22-08-2013

The program SHOULD compile - the target is SAM<SAM>, which means the outer lambda should be compatible with ()->SAM and, as a result, the inner method reference should be compatible with ()->Object (note the raw SAM).
22-08-2013

The runtime error seems fine -- the return of sam.get() is an Object, not a SAM, so it is an invalid receiver. But, the first line, where we convert a () -> Object to a () -> SAM, seems wrong, and is what leads to the heap pollution. The compiler should issue an error.
22-08-2013