Lambda expression - StackOverflowError
Issue #176
resolved
The following java8 example causes a java.lang.StackOverflowError:
public class LambdaExpr01<T> {
public LambdaExpr01(LambdaExprDataProvider<T> t) {}
public static void main(String[] args) {
LambdaExpr01<Object> a = new LambdaExpr01<>(
() -> LambdaExprObjectProducer.produce(Object.class)
);
}
}
class LambdaExprObjectProducer {
static <T> T produce(Class<T> clazz) {
T t = null;
return t;
}
}
interface LambdaExprDataProvider<T> {
T getData();
}
Stacktrace
Encountered error while processing src/LambdaExpr01.java
Fatal exception:
java.lang.StackOverflowError
at org.extendj.ast.Block.getStmtListNoTransform(Block.java:289)
at org.extendj.ast.Block.Define_lookupType(Block.java:888)
at org.extendj.ast.ASTNode.Define_lookupType(ASTNode.java:2012)
at org.extendj.ast.Expr.lookupType(Expr.java:1927)
at org.extendj.ast.ClassInstanceExpr.Define_lookupType(ClassInstanceExpr.java:1817)
at org.extendj.ast.ASTNode.Define_lookupType(ASTNode.java:2012)
at org.extendj.ast.Expr.lookupType(Expr.java:1927)
at org.extendj.ast.TypeAccess.decls(TypeAccess.java:377)
at org.extendj.ast.TypeAccess.refined_TypeScopePropagation_TypeAccess_decl(TypeAccess.java:341)
at org.extendj.ast.TypeAccess.decl(TypeAccess.java:390)
at org.extendj.ast.TypeAccess.type(TypeAccess.java:532)
at org.extendj.ast.DiamondAccess.type_compute(DiamondAccess.java:389)
at org.extendj.ast.DiamondAccess.type(DiamondAccess.java:377)
at org.extendj.ast.ClassInstanceExpr.decls_compute(ClassInstanceExpr.java:1025)
at org.extendj.ast.ClassInstanceExpr.decls(ClassInstanceExpr.java:1013)
at org.extendj.ast.ClassInstanceExpr.decl_compute(ClassInstanceExpr.java:1063)
at org.extendj.ast.ClassInstanceExpr.decl(ClassInstanceExpr.java:1051)
at org.extendj.ast.ClassInstanceExpr.Define_targetType(ClassInstanceExpr.java:1995)
at org.extendj.ast.ASTNode.Define_targetType(ASTNode.java:3332)
at org.extendj.ast.Expr.targetType(Expr.java:2096)
at org.extendj.ast.LambdaExpr.targetInterface_compute(LambdaExpr.java:1021)
at org.extendj.ast.LambdaExpr.targetInterface(LambdaExpr.java:1009)
at org.extendj.ast.LambdaExpr.type_compute(LambdaExpr.java:1068)
at org.extendj.ast.LambdaExpr.type(LambdaExpr.java:1052)
at org.extendj.ast.Expr.computeConstraints(Expr.java:225)
at org.extendj.ast.Expr.inferTypeArguments_compute(Expr.java:1243)
at org.extendj.ast.Expr.inferTypeArguments(Expr.java:1228)
at org.extendj.ast.DiamondAccess.potentiallyApplicable(DiamondAccess.java:118)
at org.extendj.ast.DiamondAccess.potentiallyApplicable(DiamondAccess.java:90)
at org.extendj.ast.DiamondAccess.chooseConstructor(DiamondAccess.java:69)
at org.extendj.ast.DiamondAccess.type_compute(DiamondAccess.java:408)
at org.extendj.ast.DiamondAccess.type(DiamondAccess.java:377)
...
Comments (3)
-
-
- changed component to analysis
- removed responsible
-
- changed status to resolved
Make LambdaExpr.type() circular to fix eval loop
LambdaExpr and Diamond had mutually circular type inference/analysis causing an infinite loop during type analysis.
fixes
#176(bitbucket)→ <<cset 641e69280e86>>
- Log in to comment
The StackOverflowError is caused by lambda type analysis being co-circular with Diamond type inference. To break the loop one of the attributes in the cycle needs to be declared circular.