"Recursive" lambda makes the compiler crash

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


Sorry, I forgot to mention that the crash is happening
with lambda-8-b99-linux-x64-14_jul_2013.


On 20 July 2013 13:00, Grégoire Neuville <gregoire.neuville at gmail.com>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