[ https://issues.apache.org/jira/browse/GROOVY-10920?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17682159#comment-17682159 ]
Jason Garrett commented on GROOVY-10920: ---------------------------------------- This affects 3.0 back to at least 3.0.8 and 2.5 back to at least 2.5.14. > Compiler exception with void expression as while condition with CompileStatic > ----------------------------------------------------------------------------- > > Key: GROOVY-10920 > URL: https://issues.apache.org/jira/browse/GROOVY-10920 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 3.0.14, 2.5.21 > Reporter: Jason Garrett > Priority: Minor > > Under static compilation, using a void expression as the condition (or part > of the condition) of a while statement causes the compiler to throw > exceptions. > This code: > {code:java} > package example > import groovy.transform.CompileStatic > @CompileStatic > class WhileVoid { > void isSo() { > null > } > void myBuggyConstruct() { > while(isSo()) { > null > } > } > } > {code} > results in this exception from the compiler: > {code:java} > startup failed: > General error during instruction selection: ASM reporting processing error > for example.WhileVoid#myBuggyConstruct with signature void myBuggyConstruct() > in WhileVoid.groovy:11. > /Users/jasongarrett/scratch/scratch/src/main/groovy/example/WhileVoid.groovy > groovy.lang.GroovyRuntimeException: ASM reporting processing error for > example.WhileVoid#myBuggyConstruct with signature void myBuggyConstruct() in > WhileVoid.groovy:11. > /Users/jasongarrett/scratch/scratch/src/main/groovy/example/WhileVoid.groovy > at > org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:432) > at > org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:106) > at > org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:557) > at org.codehaus.groovy.ast.ClassNode.visitMethods(ClassNode.java:1094) > at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1087) > at > org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:52) > at > org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:273) > at > org.codehaus.groovy.control.CompilationUnit$3.call(CompilationUnit.java:798) > at > org.codehaus.groovy.control.CompilationUnit$IPrimaryClassNodeOperation.doPhaseOperation(CompilationUnit.java:943) > at > org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:672) > at > org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:636) > at > org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:611) > at > org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:277) > at > org.gradle.api.internal.tasks.compile.ApiGroovyCompiler.execute(ApiGroovyCompiler.java:67) > at > org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:98) > at > org.gradle.api.internal.tasks.compile.GroovyCompilerFactory$DaemonSideCompiler.execute(GroovyCompilerFactory.java:77) > at > org.gradle.api.internal.tasks.compile.daemon.AbstractDaemonCompiler$CompilerWorkAction.execute(AbstractDaemonCompiler.java:135) > at > org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) > at > org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:49) > at > org.gradle.workers.internal.AbstractClassLoaderWorker$1.create(AbstractClassLoaderWorker.java:43) > at > org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:97) > at > org.gradle.workers.internal.AbstractClassLoaderWorker.executeInClassLoader(AbstractClassLoaderWorker.java:43) > at > org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:49) > at > org.gradle.workers.internal.IsolatedClassloaderWorker.run(IsolatedClassloaderWorker.java:30) > at > org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:85) > at > org.gradle.workers.internal.WorkerDaemonServer.run(WorkerDaemonServer.java:55) > at > org.gradle.process.internal.worker.request.WorkerAction$1.call(WorkerAction.java:138) > at > org.gradle.process.internal.worker.child.WorkerLogEventListener.withWorkerLoggingProtocol(WorkerLogEventListener.java:41) > at > org.gradle.process.internal.worker.request.WorkerAction.run(WorkerAction.java:135) > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.base/java.lang.reflect.Method.invoke(Method.java:566) > at > org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) > at > org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) > at > org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182) > at > org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164) > at > org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:414) > at > org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) > at > org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) > at > org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) > at java.base/java.lang.Thread.run(Thread.java:834) > Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds > for length 0 > at groovyjarjarasm.asm.Frame.merge(Frame.java:1268) > at groovyjarjarasm.asm.Frame.merge(Frame.java:1233) > at > groovyjarjarasm.asm.MethodWriter.computeAllFrames(MethodWriter.java:1611) > at groovyjarjarasm.asm.MethodWriter.visitMaxs(MethodWriter.java:1547) > at > org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:413) > Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds > for length 0 > {code} > This example, with a slightly more complex condition for the while loop: > {code:java} > package example > import groovy.transform.CompileStatic > @CompileStatic > class WhileNotVoid { > List list = [] > void isSo() { > null > } > void myBuggyConstruct() { > while(!list.empty && !isSo()) { > null > } > } > } > {code} > results in a different compiler exception: > {code:java} > BUG! exception in phase 'class generation' in source unit > '/Users/jasongarrett/scratch/scratch/src/main/groovy/example/WhileNotVoid.groovy' > operand stack contains 2 elements, but we expected only 0 > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)