JDK-8077605 : Initializing static fields causes unbounded recursion in javac
  • Type: Bug
  • Component: tools
  • Sub-Component: javac
  • Affected Version: 8u40
  • Priority: P4
  • Status: Closed
  • Resolution: Fixed
  • OS: linux
  • CPU: x86_64
  • Submitted: 2015-04-12
  • Updated: 2019-07-15
  • Resolved: 2015-04-27
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 9
9 b63Fixed
Related Reports
Duplicate :  
Duplicate :  
Duplicate :  
Duplicate :  
Duplicate :  
Duplicate :  
Description
FULL PRODUCT VERSION :
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

javac -version
javac 1.8.0_40


ADDITIONAL OS VERSION INFORMATION :
Linux 3.16.7-ckt5-sk+ #1 SMP Tue Feb 17 22:00:49 EST 2015 x86_64 x86_64 x86_64 GNU/Linux

A DESCRIPTION OF THE PROBLEM :
When performing a particular set of specific operations when initializing a `static final` field, javac overflows the stack.

It appears as if the combination of String append and performing a map operation on a stream cause this behavior.

Behavior noticed by user on reddit forum (not me, although I have reproduced it): https://www.reddit.com/r/learnprogramming/comments/32bfle/can_you_explain_this_strange_java8_error/

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Attempt to compile provided source code.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Successful compilation
ACTUAL -
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
    at com.sun.tools.javac.code.Scope.dupUnshared(Scope.java:144)
    at com.sun.tools.javac.comp.Attr.lambdaEnv(Attr.java:2609)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2275)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)

ERROR MESSAGES/STACK TRACES THAT OCCUR :
The system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowError
    at com.sun.tools.javac.code.Scope.dupUnshared(Scope.java:144)
    at com.sun.tools.javac.comp.Attr.lambdaEnv(Attr.java:2609)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2275)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)
    at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404)
    at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)
    at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566)

REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class uncompilable
{
    static final List<String> stringList = Arrays.asList("doesnt", "matter");

    static final String finalJoinedMappedAppendedString = "" + fakeJoin(stringList.stream().map(str -> str).collect(Collectors.toList()));

    private static String fakeJoin(List<String> doesntMatter) {
        return "anything";
    }   

    public static void main(String[] args) { } 
}
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
From forum post:

"Oh and additionally, if you put the stream/map/collect calls into a random static function and call that instead, it all works fine. It just dislikes being directly attached to the static final field."


Comments
1) Run the attached test case (Uncompilable.java) 2) Tested this on Linux and Windows 7 (64-bit) with JDK 8u31, 8u40, 8u60 ea b07 and 9 ea b57. ****************************************************************************************** 8u31: FAIL 8u40: FAIL 8u60 ea b07: FAIL 9 ea b57: FAIL ******************************************************************************************* Output (JDK 8u40): >javac uncompilable.java The system is out of resources. Consult the following stack trace for details. java.lang.StackOverflowError at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2266) at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566) at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404) at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566) at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404) at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566) at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404) at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566) at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2404) at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624) at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:566) ............................... .................................. ************************************************************************************************** Result: The error is reproducible with JDK 8u40, 8u60 ea b06 and 9 ea b57.
13-04-2015