/*
 * 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> Z id(Z z) { return z; }
}
