"Recursive" lambda makes the compiler crash

maurizio cimadamore maurizio.cimadamore at oracle.com
Sat Jul 20 04:11:05 PDT 2013


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

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)
>



More information about the lambda-dev mailing list