Bug 77244

Summary: [1.5][enum] final enum class crashes the compiler
Product: [Eclipse Project] JDT Reporter: Olivier Thomann <Olivier_Thomann>
Component: CoreAssignee: Olivier Thomann <Olivier_Thomann>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: 3.1   
Target Milestone: 3.1 M3   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Olivier Thomann CLA 2004-10-28 17:16:01 EDT
Using latest, compile this code:
public final enum X {
	
	BLEU(10) {
		String foo() { // inner
			return super.foo() + this.val;
		}
	},
	BLANC(20),
	ROUGE(30);

	int val;
	X(int val) {
		this.val = val;
	}
	String foo() {  // outer
		return this.name();
	}
	public static void main(String[] args) {
		for(X x: values()) {
			System.out.print(x.foo());
		}
	}
}

You get:
----------
1. ERROR in c:\tests_sources\X.java (at line 0)
	public final enum X {
	^
Internal compiler error
java.lang.NullPointerException
	at
org.eclipse.jdt.internal.compiler.problem.ProblemReporter.anonymousClassCannotExtendFinalClass(ProblemReporter.java:135)
	at
org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression.resolveType(QualifiedAllocationExpression.java:247)
	at
org.eclipse.jdt.internal.compiler.ast.FieldDeclaration.resolve(FieldDeclaration.java:199)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:966)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1034)
	at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:280)
	at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:510)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:335)
	at org.eclipse.jdt.internal.compiler.batch.Main.performCompilation(Main.java:1677)
	at org.eclipse.jdt.internal.compiler.batch.Main.compile(Main.java:375)
	at org.eclipse.jdt.internal.compiler.batch.Main.compile(Main.java:268)
	at org.eclipse.jdt.internal.compiler.batch.Main.compile(Main.java:260)
	at org.eclipse.jdt.core.tools.compiler.Compile.main(Compile.java:19)

This is because we try to return this error using the anonymous type of the enum
constant and its type is null. We simply need to change the error message in the
qualified allocation expression.

javac doesn't accept final enum class. This is legal as long as no enum constant
has a class body.
Comment 1 Philipe Mulet CLA 2004-10-28 17:37:33 EDT
Should reject final modifier for enum.
Comment 2 Philipe Mulet CLA 2004-10-28 18:00:37 EDT
Added regression test: EnumTest#test024.
Fixed
Comment 3 David Audel CLA 2004-11-04 10:46:45 EST
Reopen 

In build I200411040100 an NPE still occur

Java.lang.NullPointerException
	at
org.eclipse.jdt.internal.compiler.problem.ProblemReporter.anonymousClassCannotExtendFinalClass(ProblemReporter.java:135)
	at
org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression.resolveType(QualifiedAllocationExpression.java:248)
	at
org.eclipse.jdt.internal.compiler.ast.FieldDeclaration.resolve(FieldDeclaration.java:199)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:966)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.resolve(TypeDeclaration.java:1034)
	at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.resolve(CompilationUnitDeclaration.java:280)
	at org.eclipse.jdt.internal.compiler.Compiler.resolve(Compiler.java:566)
	at
org.eclipse.jdt.internal.core.CompilationUnitProblemFinder.process(CompilationUnitProblemFinder.java:175)
	at
org.eclipse.jdt.internal.core.CompilationUnit.buildStructure(CompilationUnit.java:143)
	at org.eclipse.jdt.internal.core.Openable.generateInfos(Openable.java:203)
	at org.eclipse.jdt.internal.core.JavaElement.openWhenClosed(JavaElement.java:553)
	at
org.eclipse.jdt.internal.core.CompilationUnit.makeConsistent(CompilationUnit.java:978)
	at
org.eclipse.jdt.internal.core.ReconcileWorkingCopyOperation.executeOperation(ReconcileWorkingCopyOperation.java:60)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperation.java:700)
	at
org.eclipse.jdt.internal.core.JavaModelOperation.runOperation(JavaModelOperation.java:739)
	at
org.eclipse.jdt.internal.core.CompilationUnit.reconcile(CompilationUnit.java:1104)
	at
org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:91)
	at
org.eclipse.jdt.internal.ui.text.java.JavaReconcilingStrategy.reconcile(JavaReconcilingStrategy.java:133)
	at
org.eclipse.jdt.internal.ui.text.CompositeReconcilingStrategy.reconcile(CompositeReconcilingStrategy.java:86)
	at
org.eclipse.jdt.internal.ui.text.JavaCompositeReconcilingStrategy.reconcile(JavaCompositeReconcilingStrategy.java:96)
	at org.eclipse.jface.text.reconciler.MonoReconciler.process(MonoReconciler.java:75)
	at org.eclipse.jdt.internal.ui.text.JavaReconciler.process(JavaReconciler.java:318)
	at
org.eclipse.jface.text.reconciler.AbstractReconciler$BackgroundThread.run(AbstractReconciler.java:204)
Comment 4 Olivier Thomann CLA 2004-11-04 12:15:54 EST
New fix is released. The regression test has been updated.
Comment 5 Olivier Thomann CLA 2004-11-04 18:36:24 EST
Verified in 200411041600