OpenJDK / jdk9 / jdk9 / langtools
changeset 2778:6a927a9114c1
8066871: java.lang.VerifyError: Bad local variable type - local final String
Summary: baseType() erroneously called on MethodResultInfo causes lack of constant type info
Reviewed-by: jlahoda, mcimadamore
Contributed-by: srikanth.adayapalam@oracle.com
author | mcimadamore |
---|---|
date | Fri, 09 Jan 2015 15:48:09 +0000 |
parents | 7b2e1f42a6ad |
children | 6d3e36e420df |
files | src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java test/tools/javac/conditional/ConditionalWithFinalStrings.java |
diffstat | 3 files changed, 71 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Thu Jan 08 22:01:20 2015 -0800 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java Fri Jan 09 15:48:09 2015 +0000 @@ -207,6 +207,7 @@ * are correct. * * @param tree The tree whose kind and type is checked + * @param found The computed type of the tree * @param ownkind The computed kind of the tree * @param resultInfo The expected result of the tree */
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Thu Jan 08 22:01:20 2015 -0800 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java Fri Jan 09 15:48:09 2015 +0000 @@ -1008,7 +1008,7 @@ DeferredType dt = (DeferredType)found; return dt.check(this); } else { - Type uResult = U(found.baseType()); + Type uResult = U(found); Type capturedType = pos == null || pos.getTree() == null ? types.capture(uResult) : checkContext.inferenceContext()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/tools/javac/conditional/ConditionalWithFinalStrings.java Fri Jan 09 15:48:09 2015 +0000 @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2015, 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 8066871 + * @summary java.lang.VerifyError: Bad local variable type - local final String + * @author Srikanth Sankaran + * + * @compile -g:none ConditionalWithFinalStrings.java + * @run main ConditionalWithFinalStrings + */ + +public class ConditionalWithFinalStrings { + + interface I { + String foo(); + } + + static class Tmp { + private String value; + public void setValue(String tmpStr) { + this.value = tmpStr; + if (!this.value.equals("YES")) + throw new AssertionError(); + } + } + + void goo(I i) { + if (!i.foo().equals("YES")) + throw new AssertionError(); + } + + public void test() { + final String y = "YES"; + final String n = "NO"; + Tmp tmp = new Tmp(); + tmp.setValue(true ? y : n); + goo (() -> y); + + } + public static void main(String[] args) { + new ConditionalWithFinalStrings().test(); + if (!id("Hello!").equals("Hello!")) + throw new AssertionError(); + + } + static <Z> Z id(Z z) { return z; } +}