diff --git a/src/share/classes/com/sun/tools/javac/comp/Attr.java b/src/share/classes/com/sun/tools/javac/comp/Attr.java index a88b6a0f9d347ce1cc6bb0c55bd37ce88bd9d790..96148f02f5180e556b5e2d4b8ac04b9448ec40c1 100644 --- a/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, 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 @@ -249,6 +249,7 @@ public class Attr extends JCTree.Visitor { * 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 */ diff --git a/src/share/classes/com/sun/tools/javac/comp/Resolve.java b/src/share/classes/com/sun/tools/javac/comp/Resolve.java index eace107252c98e05729aa888999e711b828b1558..064b3bb97df6920efd9a72fc41eb6c70a68de2a3 100644 --- a/src/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/src/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2016, 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 @@ -1007,7 +1007,7 @@ public class Resolve { 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() diff --git a/test/tools/javac/conditional/ConditionalWithFinalStrings.java b/test/tools/javac/conditional/ConditionalWithFinalStrings.java new file mode 100644 index 0000000000000000000000000000000000000000..a9dbdf549f1f2e8e63552e7f1a7cdb41428fe335 --- /dev/null +++ b/test/tools/javac/conditional/ConditionalWithFinalStrings.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2016, 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 id(Z z) { return z; } +}