6999635: Multicatch: crash while compiling simple code with a multicatch parameter

Missing erasure when computing stackmaps leads to assertion error

Reviewed-by: darcy
This commit is contained in:
Maurizio Cimadamore 2010-11-15 14:41:21 +00:00
parent 3a681162e4
commit 80fdc078e7
4 changed files with 96 additions and 2 deletions
langtools
src/share/classes/com/sun/tools/javac/jvm
test/tools/javac/multicatch

@ -993,7 +993,9 @@ public class ClassWriter extends ClassFile {
/** Enter an inner class into the `innerClasses' set/queue.
*/
void enterInner(ClassSymbol c) {
assert !c.type.isCompound();
if (c.type.isCompound()) {
throw new AssertionError("Unexpected intersection type: " + c.type);
}
try {
c.complete();
} catch (CompletionFailure ex) {

@ -1304,7 +1304,7 @@ public class Code {
stackCount = 0;
for (int i=0; i<state.stacksize; i++) {
if (state.stack[i] != null) {
frame.stack[stackCount++] = state.stack[i];
frame.stack[stackCount++] = types.erasure(state.stack[i]);
}
}

@ -0,0 +1,46 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6993963
* @summary Multicatch: crash while compiling simple code with a multicatch parameter
* @compile Pos08.java
*/
class Pos08 {
interface Foo {}
static class X1 extends Exception implements Foo {}
static class X2 extends Exception implements Foo {}
void m(boolean cond) {
try {
if (cond)
throw new X1();
else
throw new X2();
}
catch (final X1 | X2 ex) {}
}
}

@ -0,0 +1,46 @@
/*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 6993963
* @summary Multicatch: crash while compiling simple code with a multicatch parameter
* @compile Pos08eff_final.java
*/
class Pos08eff_final {
interface Foo {}
static class X1 extends Exception implements Foo {}
static class X2 extends Exception implements Foo {}
void m(boolean cond) {
try {
if (cond)
throw new X1();
else
throw new X2();
}
catch (X1 | X2 ex) {}
}
}