This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 634ce6b09da431b0c2df6ff6fa6aad486a6cae43
Author: Eric Milles <[email protected]>
AuthorDate: Tue Dec 10 12:37:25 2024 -0600

    GROOVY-10811: error for explicit `super(...)` call in `enum` constructor
---
 src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java | 10 ++++++++++
 src/test/gls/enums/EnumTest.groovy                          | 12 ++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java 
b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
index 851ac8c30d..4d5b3dd16d 100644
--- a/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
+++ b/src/main/java/org/codehaus/groovy/classgen/EnumVisitor.java
@@ -36,6 +36,7 @@ import org.codehaus.groovy.ast.expr.ListExpression;
 import org.codehaus.groovy.ast.expr.MapEntryExpression;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.VariableExpression;
+import org.codehaus.groovy.ast.stmt.ExpressionStatement;
 import org.codehaus.groovy.ast.stmt.Statement;
 import org.codehaus.groovy.control.CompilationUnit;
 import org.codehaus.groovy.control.SourceUnit;
@@ -44,6 +45,7 @@ import org.codehaus.groovy.syntax.SyntaxException;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringJoiner;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
 import static org.codehaus.groovy.ast.ClassHelper.int_TYPE;
@@ -118,6 +120,14 @@ public class EnumVisitor extends ClassCodeVisitorSupport {
                 } else if (!ctor.isPrivate()) {
                     addError(ctor, "Illegal modifier for the enum constructor; 
only private is permitted.");
                 }
+                if (ctor.firstStatementIsSpecialConstructorCall()) {
+                    var ctorCall = (ConstructorCallExpression) 
((ExpressionStatement) ctor.getFirstStatement()).getExpression();
+                    if (ctorCall.isSuperCall()) {
+                        var spec = new StringJoiner(",", 
enumClass.getNameWithoutPackage() + "(", ")");
+                        for (Parameter p : ctor.getParameters()) 
spec.add(p.getType().getUnresolvedName());
+                        addError(ctorCall, "Cannot invoke super constructor 
from enum constructor " + spec);
+                    }
+                }
             }
 
             // GROOVY-10811: final and abstract are implicit modifiers
diff --git a/src/test/gls/enums/EnumTest.groovy 
b/src/test/gls/enums/EnumTest.groovy
index 4d80ac1e0d..ab736d037f 100644
--- a/src/test/gls/enums/EnumTest.groovy
+++ b/src/test/gls/enums/EnumTest.groovy
@@ -859,6 +859,18 @@ class EnumTest extends CompilableTestSupport {
             """
         }
     }
+
+    // GROOVY-10811
+    void testSuperCtorCall() {
+        shouldNotCompile '''
+            enum E {
+                FOO;
+                E() {
+                    super()
+                }
+            }
+        '''
+    }
 }
 
 enum UsCoin {

Reply via email to