提交 39fb2b9d 编写于 作者: M mcimadamore

7003744: Compiler error concerning final variables

Summary: Flow analysis does not cleanup init/uninint bit masks after for-loop
Reviewed-by: jjg
上级 4ec818df
......@@ -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) {
......
......@@ -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) {
......
/*
* 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;
}
}
/*
* 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;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册