Bug 101230 - [compiler] Internal compiler error when labeled statement processing
Summary: [compiler] Internal compiler error when labeled statement processing
Status: VERIFIED FIXED
Alias: None
Product: JDT
Classification: Eclipse Project
Component: Core (show other bugs)
Version: 3.1   Edit
Hardware: PC Windows XP
: P3 normal (vote)
Target Milestone: 3.1 RC4   Edit
Assignee: Philipe Mulet CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2005-06-22 07:34 EDT by Tomasz Blachowicz / AMG.net CLA
Modified: 2005-06-24 07:45 EDT (History)
1 user (show)

See Also:


Attachments
Patch for LabeledStatement (670 bytes, patch)
2005-06-22 10:41 EDT, Philipe Mulet CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Tomasz Blachowicz / AMG.net CLA 2005-06-22 07:34:38 EDT
I isolated one more problem in RC3, the following snippet causes internal
compilation error (I know the code is sligthly stupid but I've found it in one
of classes in our project. In fact it should compile successfully):

public class X {
  public static void main(String[] args) {
    if(true) throw new RuntimeException("X");
      X: System.out.println("X");
    }
  }
}

--- Session:
eclipse.buildId=I20050617-1618
java.version=1.4.2_08
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86, WS=win32, NL=pl_PL
Command-line arguments:  -os win32 -ws win32 -arch x86
--- Exception:
java.lang.NullPointerException
	at
org.eclipse.jdt.internal.compiler.ast.MessageSend.generateCode(MessageSend.java:99)
	at
org.eclipse.jdt.internal.compiler.ast.Expression.generateCode(Expression.java:607)
	at
org.eclipse.jdt.internal.compiler.ast.LabeledStatement.generateCode(LabeledStatement.java:90)
	at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:222)
	at
org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration.generateCode(AbstractMethodDeclaration.java:169)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:561)
	at
org.eclipse.jdt.internal.compiler.ast.TypeDeclaration.generateCode(TypeDeclaration.java:615)
	at
org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration.generateCode(CompilationUnitDeclaration.java:184)
	at org.eclipse.jdt.internal.compiler.Compiler.process(Compiler.java:510)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:329)
	at
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:240)
	at
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:190)
	at
org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:50)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:213)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:141)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:593)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
	at org.eclipse.core.runtime.Platform.run(Platform.java:783)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:168)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:202)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:231)
	at
org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:1044)
	at org.eclipse.core.runtime.Platform.run(Platform.java:783)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:234)
	at
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:253)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:282)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:139)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:200)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:76)
Comment 1 Tomasz Blachowicz / AMG.net CLA 2005-06-22 07:35:47 EDT
Sorry, there is a mistake. Should be:

public class X {
  public static void main(String[] args) {
    if(true) throw new RuntimeException("X");
    X: System.out.println("X");
  }
}
Comment 2 Olivier Thomann CLA 2005-06-22 09:55:27 EDT
Regression compare to 3.0.2.
Another test case is:
public class X {
  public static void main(String[] args) {
    if(true) {
    	System.out.println("Y");
    	return;
    }
      loop: System.out.println("X");
    }
  }
Comment 3 Philipe Mulet CLA 2005-06-22 10:38:50 EDT
Fix is trivial, and since this is a regression. Candidating for RC4.
Comment 4 Philipe Mulet CLA 2005-06-22 10:41:57 EDT
Created attachment 23733 [details]
Patch for LabeledStatement

We are doing the same (missing) check for all other statements.
I believe in 3.0 we were silently generating deadcode, but now it is causing
more grief.
Comment 5 Philipe Mulet CLA 2005-06-22 11:00:37 EDT
Added regression test: ConformTest#test247.
Released fix.
Comment 6 Olivier Thomann CLA 2005-06-22 11:33:13 EDT
In 3.0.2, dead code was generated.

  public static void main(String[] args);
     0  new java.lang.RuntimeException [17]
     3  dup
     4  ldc <String "X"> [18]
     6  invokespecial java.lang.RuntimeException(java.lang.String) [21]
     9  athrow
    10  getstatic java.lang.System.out : java.io.PrintStream [27]
    13  ldc <String "X"> [18]
    15  invokevirtual java.io.PrintStream.println(java.lang.String) : void  [32]

From 10 to 15, the bytecodes are unreachable.
Comment 7 Maxime Daniel CLA 2005-06-24 07:42:25 EDT
Verified for Build id: I20050624-0010.
Comment 8 Olivier Thomann CLA 2005-06-24 07:45:13 EDT
Verified.