# HG changeset patch # User vromero # Date 1372801780 -3600 # Node ID 1d6d1be0a94f59a6a69bbe0301ed66f327da28ee # Parent 62748bbd2f47524c0f8ba3b2d5a2526a3acd08c6 6326693: variable x might already have been assigned, when assignment is in catch block Reviewed-by: mcimadamore diff -r 62748bbd2f47 -r 1d6d1be0a94f langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Mon Jul 01 16:36:08 2013 -0700 +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java Tue Jul 02 22:49:40 2013 +0100 @@ -1945,10 +1945,17 @@ } } + /* The analysis of each catch should be independent. + * Each one should have the same initial values of inits and + * uninits. + */ + final Bits initsCatchPrev = new Bits(initsTry); + final Bits uninitsCatchPrev = new Bits(uninitsTry); + for (List l = tree.catchers; l.nonEmpty(); l = l.tail) { JCVariableDecl param = l.head.param; - inits.assign(initsTry); - uninits.assign(uninitsTry); + inits.assign(initsCatchPrev); + uninits.assign(uninitsCatchPrev); scan(param); inits.incl(param.sym.adr); uninits.excl(param.sym.adr); diff -r 62748bbd2f47 -r 1d6d1be0a94f langtools/test/tools/javac/T6326693/FinalVariableAssignedToInCatchBlockTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T6326693/FinalVariableAssignedToInCatchBlockTest.java Tue Jul 02 22:49:40 2013 +0100 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2013, 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 6356530 + * @summary -Xlint:serial does not flag abstract classes with concrete methods/members + * @compile/fail/ref=FinalVariableAssignedToInCatchBlockTest.out -XDrawDiagnostics FinalVariableAssignedToInCatchBlockTest.java + */ + +import java.io.IOException; + +public class FinalVariableAssignedToInCatchBlockTest { + public void m1(int o) + { + final int i; + try { + if (o == 1) { + throw new IOException(); + } else if (o == 2) { + throw new InterruptedException(); + } else { + throw new Exception(); + } + } catch (IOException e) { + i = 1; + } catch (InterruptedException ie) { + i = 2; + } catch (Exception e) { + i = 3; + } finally { + i = 4; + } + } + + public void m2(int o) + { + final int i; + try { + if (o == 1) { + throw new IOException(); + } else if (o == 2) { + throw new InterruptedException(); + } else { + throw new Exception(); + } + } catch (IOException e) { + i = 1; + } catch (InterruptedException ie) { + i = 2; + } catch (Exception e) { + i = 3; + } + } + + public void m3(int o) throws Exception + { + final int i; + try { + if (o == 1) { + throw new IOException(); + } else if (o == 2) { + throw new InterruptedException(); + } else { + throw new Exception(); + } + } catch (IOException e) { + i = 1; + } catch (InterruptedException ie) { + i = 2; + } + i = 3; + } +} diff -r 62748bbd2f47 -r 1d6d1be0a94f langtools/test/tools/javac/T6326693/FinalVariableAssignedToInCatchBlockTest.out --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/T6326693/FinalVariableAssignedToInCatchBlockTest.out Tue Jul 02 22:49:40 2013 +0100 @@ -0,0 +1,3 @@ +FinalVariableAssignedToInCatchBlockTest.java:52:13: compiler.err.var.might.already.be.assigned: i +FinalVariableAssignedToInCatchBlockTest.java:92:9: compiler.err.var.might.already.be.assigned: i +2 errors