"Recursive" lambda makes the compiler crash

Grégoire Neuville gregoire.neuville at gmail.com
Sat Jul 20 04:18:37 PDT 2013


Thanks for the info !


On 20 July 2013 13:11, maurizio cimadamore
<maurizio.cimadamore at oracle.com>wrote:

> Hi - thanks for the report -  we are aware of the issue [1], which is
> currently being worked on.
> It appears that some patch that went in for supporting type-annotations
> (JSR 308) broke translation support for lambda expression in certain cases.
>
> [1] - http://bugs.sun.com/view_bug.**do?bug_id=8020715<http://bugs.sun.com/view_bug.do?bug_id=8020715>
>
> Thanks
> Maurizio
>
>
> On 20-Jul-13 12:00 PM, Grégoire Neuville wrote:
>
>> Hello,
>>
>> The following code :
>>
>> public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
>> Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {
>>
>>      final class Folder {
>>          final F<Stream<A>, Promise<B>> foldr = as -> as.isEmpty() ?
>>                  promise(s, P.p(b)) :
>>                  liftM2(f).f(promise(s, P.p(as.head())))
>>                          .f(Promise.<P1<B>>join(s, () ->
>> foldr.f(as.tail()._1()).fmap(**P.p1())));
>>      }
>>
>>      return new Folder().foldr;
>> }
>>
>> makes the compile crash (cf. stack trace below).
>>
>> That one however :
>>
>> public static <A, B> F<Stream<A>, Promise<B>> foldRightS(final
>> Strategy<Unit> s, final F<A, F<P1<B>, B>> f, final B b) {
>>
>>      final F<Stream<A>, Promise<B>> foldr = new F<Stream<A>,
>> Promise<B>>() {
>>          final F<Stream<A>, Promise<B>> self = this;
>>          public Promise<B> f(Stream<A> as) {
>>              return as.isEmpty() ?
>>                  promise(s, P.p(b)) :
>>                  liftM2(f).f(promise(s, P.p(as.head())))
>>                      .f(Promise.<P1<B>>join(s, () ->
>> self.f(as.tail()._1()).fmap(P.**p1())));
>>          }
>>      };
>>
>>      return foldr;
>> }
>>
>> compiles fine.
>>
>> Hope that'll help
>>
>> Grégoire Neuville.
>>
>> Stack trace on crash :
>>
>> java.lang.ClassCastException: com.sun.tools.javac.code.**
>> Symbol$ClassSymbol
>> cannot be cast to com.sun.tools.javac.code.**Symbol$MethodSymbol
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitLambda(**
>> LambdaToMethod.java:259)
>> at com.sun.tools.javac.tree.**JCTree$JCLambda.accept(JCTree.**java:1609)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitVarDef(**
>> TreeTranslator.java:153)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitVarDef(**
>> LambdaToMethod.java:448)
>> at com.sun.tools.javac.tree.**JCTree$JCVariableDecl.accept(**
>> JCTree.java:846)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitClassDef(**
>> TreeTranslator.java:134)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitClassDef(**
>> LambdaToMethod.java:230)
>> at com.sun.tools.javac.tree.**JCTree$JCClassDecl.accept(**
>> JCTree.java:687)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitBlock(**
>> TreeTranslator.java:162)
>> at com.sun.tools.javac.tree.**JCTree$JCBlock.accept(JCTree.**java:903)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitMethodDef(**
>> TreeTranslator.java:145)
>> at com.sun.tools.javac.tree.**JCTree$JCMethodDecl.accept(**
>> JCTree.java:772)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:70)
>> at
>> com.sun.tools.javac.tree.**TreeTranslator.visitClassDef(**
>> TreeTranslator.java:134)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.visitClassDef(**
>> LambdaToMethod.java:230)
>> at com.sun.tools.javac.tree.**JCTree$JCClassDecl.accept(**
>> JCTree.java:687)
>> at com.sun.tools.javac.tree.**TreeTranslator.translate(**
>> TreeTranslator.java:58)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:190)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.translate(**
>> LambdaToMethod.java:183)
>> at
>> com.sun.tools.javac.comp.**LambdaToMethod.**translateTopLevelClass(**
>> LambdaToMethod.java:210)
>> at com.sun.tools.javac.main.**JavaCompiler.desugar(**
>> JavaCompiler.java:1442)
>> at com.sun.tools.javac.main.**JavaCompiler.desugar(**
>> JavaCompiler.java:1327)
>> at com.sun.tools.javac.main.**JavaCompiler.compile2(**
>> JavaCompiler.java:877)
>> at com.sun.tools.javac.main.**JavaCompiler.compile(**
>> JavaCompiler.java:836)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:517)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:376)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:365)
>> at com.sun.tools.javac.main.Main.**compile(Main.java:356)
>> at com.sun.tools.javac.Main.**compile(Main.java:77)
>> at com.sun.tools.javac.Main.main(**Main.java:62)
>>
>>
>


-- 
Grégoire Neuville


More information about the lambda-dev mailing list