Hello, not everything works smoothly in Groovy 4 MarkupTemplateEngine.
A "minus null" operation on list concatenation gives an internal compiler error in the MarkupTemplateEngine but works outside of it. Groovy 3.0.10 does not have this problem. Consider the example in the attachment. $ groovy markup-template-test.groovy Groovy: 3.0.10 JDK: 17.0.2 a <div>a</div> $ groovy markup-template-test.groovy Groovy: 4.0.2 JDK: 17.0.2 a org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: General error during instruction selection: Internal compiler error while compiling GeneratedMarkupTemplate0 Method: org.codehaus.groovy.ast.MethodNode@5f13be1[java.lang.Object run() from GeneratedMarkupTemplate0] Line 4, expecting casting to java.util.List<?> but operand stack is empty java.lang.ArrayIndexOutOfBoundsException: Internal compiler error while compiling GeneratedMarkupTemplate0 Method: org.codehaus.groovy.ast.MethodNode@5f13be1[java.lang.Object run() from GeneratedMarkupTemplate0] Line 4, expecting casting to java.util.List<?> but operand stack is empty at org.codehaus.groovy.classgen.asm.OperandStack.throwExceptionForNoStackElement(OperandStack.java:335) at org.codehaus.groovy.classgen.asm.OperandStack.doConvertAndCast(OperandStack.java:340) at org.codehaus.groovy.classgen.asm.OperandStack.doGroovyCast(OperandStack.java:305) at org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.visitArgument(StaticInvocationWriter.java:509) at org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.loadArguments(StaticInvocationWriter.java:454) at org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.writeDirectMethodCall(StaticInvocationWriter.java:298) at org.codehaus.groovy.classgen.asm.InvocationWriter.makeDirectCall(InvocationWriter.java:309) at org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:127) at org.codehaus.groovy.classgen.asm.InvocationWriter.makeCall(InvocationWriter.java:121) at org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.makeCall(StaticInvocationWriter.java:642) at org.codehaus.groovy.classgen.asm.InvocationWriter.writeInvokeMethod(InvocationWriter.java:452) at org.codehaus.groovy.classgen.asm.sc.StaticInvocationWriter.writeInvokeMethod(StaticInvocationWriter.java:131) at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:974) at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:77) at org.codehaus.groovy.classgen.asm.BinaryExpressionHelper.evaluateEqual(BinaryExpressionHelper.java:397) at org.codehaus.groovy.classgen.asm.sc.StaticTypesBinaryExpressionMultiTypeDispatcher.evaluateEqual(StaticTypesBinaryExpressionMultiTypeDispatcher.java:217) at org.codehaus.groovy.classgen.AsmClassGenerator.visitDeclarationExpression(AsmClassGenerator.java:832) at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89) at org.codehaus.groovy.classgen.asm.StatementWriter.writeExpressionStatement(StatementWriter.java:611) at org.codehaus.groovy.classgen.AsmClassGenerator.visitExpressionStatement(AsmClassGenerator.java:816) at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:41) at org.codehaus.groovy.classgen.asm.StatementWriter.writeBlockStatement(StatementWriter.java:94) at org.codehaus.groovy.classgen.asm.sc.StaticTypesStatementWriter.writeBlockStatement(StaticTypesStatementWriter.java:77) at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:747) at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:70) at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:601) at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:546) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:110) at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:685) at org.codehaus.groovy.ast.ClassNode.visitMethods(ClassNode.java:1131) at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1124) at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52) at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:364) at org.codehaus.groovy.control.CompilationUnit$3.call(CompilationUnit.java:797) at org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:937) at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:692) at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:666) at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:373) at groovy.lang.GroovyClassLoader.lambda$parseClass$2(GroovyClassLoader.java:316) at org.codehaus.groovy.runtime.memoize.StampedCommonCache.compute(StampedCommonCache.java:163) at org.codehaus.groovy.runtime.memoize.StampedCommonCache.getAndPut(StampedCommonCache.java:154) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:314) at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:298) at groovy.text.markup.MarkupTemplateEngine$TemplateGroovyClassLoader.parseClass(MarkupTemplateEngine.java:261) at groovy.text.markup.MarkupTemplateEngine$MarkupTemplateMaker.<init>(MarkupTemplateEngine.java:211) at groovy.text.markup.MarkupTemplateEngine.createTemplate(MarkupTemplateEngine.java:144) at groovy.text.TemplateEngine.createTemplate(TemplateEngine.java:47) at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318) at markup-template-test.run(markup-template-test.groovy:14) at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:268) at groovy.lang.GroovyShell.run(GroovyShell.java:374) at groovy.lang.GroovyShell.run(GroovyShell.java:363) at groovy.ui.GroovyMain.processOnce(GroovyMain.java:649) at groovy.ui.GroovyMain.run(GroovyMain.java:389) at groovy.ui.GroovyMain.access$1400(GroovyMain.java:67) at groovy.ui.GroovyMain$GroovyCommand.process(GroovyMain.java:313) at groovy.ui.GroovyMain.processArgs(GroovyMain.java:141) at groovy.ui.GroovyMain.main(GroovyMain.java:114) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109) at org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:132) 1 error A workaround is def l = (a + b).findAll{it}.flatten() Should I open an issue? Best regards, Jörg
import groovy.text.Template import groovy.text.markup.MarkupTemplateEngine import groovy.text.markup.TemplateConfiguration println "Groovy: " + GroovySystem.version + " JDK: " + System.getProperty("java.version") def a = [ 'a' ] def b = null def l = (a + b - null).flatten() println l.join(',') TemplateConfiguration config = new TemplateConfiguration() MarkupTemplateEngine engine = new MarkupTemplateEngine(config) Template template = engine.createTemplate(""" def a = [ 'a' ] def b = null def l = (a + b - null).flatten() div { yield l.join(',') } """) Map<String, Object> model = [:] StringWriter writer = new StringWriter() Writable output = template.make(model) output.writeTo(writer) println writer.toString()