7003744: Compiler error concerning final variables

Flow analysis does not cleanup init/uninint bit masks after for-loop

Reviewed-by: jjg
This commit is contained in:
Maurizio Cimadamore 2010-12-06 11:49:00 +00:00
parent 6bdab59e81
commit 63f05334a6
4 changed files with 104 additions and 0 deletions

View File

@ -886,6 +886,8 @@ public class Flow extends TreeScanner {
alive = resolveBreaks(tree, prevPendingExits) ||
tree.cond != null && !tree.cond.type.isTrue();
nextadr = nextadrPrev;
inits.excludeFrom(nextadr);
uninits.excludeFrom(nextadr);
}
public void visitForeachLoop(JCEnhancedForLoop tree) {

View File

@ -101,6 +101,15 @@ public class Bits {
(1 << (x & wordmask));
}
/** Exclude [start...end] from this set.
*/
public void excludeFrom(int start) {
Bits temp = new Bits();
temp.sizeTo(bits.length);
temp.inclRange(0, start);
andSet(temp);
}
/** Exclude x from this set.
*/
public void excl(int x) {

View File

@ -0,0 +1,47 @@
/*
* 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 7003744 6999622
* @summary Compiler error concerning final variables
* @author mcimadamore
*
* @compile T7003744a.java
*/
class T7003744a {
final Object x;
T7003744a() {
{
int inx = 0;
for(int i = 0; i < 5; i++) { }
}
for(String am: new String[1]) {
final String mode = am;
}
x = null;
}
}

View File

@ -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 7003744 6999622
* @summary Compiler error concerning final variables
* @author mcimadamore
*
* @compile T7003744b.java
*/
class T7003744b {
void test() {
final int bogus;
for (int i1 = 0, i2 = 2; i1 < i2; i1++) {
final int i_1 = 2;
}
for (Object o : new Object[] { null }) {
final int i_2 = 2;
}
bogus = 4;
}
}