/*
 * Copyright (c) 2020, 2023, 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.
 */

/*
// This jasm file implements the following java code:
interface I { }

public class InterfaceObj implements I {
    static void c(I intf) throws Throwable {
        I.clone();
    }
    public static void testClone() throws Throwable {
        c(new InterfaceObj());
    }
  }
*/

public interface I version 60:0 { } // end Class I


super public class InterfaceObj implements I version 60:0 {


    public Method "<init>":"()V" stack 1 locals 1 {
        aload_0;
        invokespecial    Method java/lang/Object."<init>":"()V";
        return;
    }

    static Method c:"(LI;)V" throws java/lang/Throwable stack 1 locals 1 {
        aload_0;
        invokeinterface    InterfaceMethod I.clone:"()Ljava/lang/Object;", 1;
        return;
    }

    public static Method testClone:"()V" throws java/lang/Throwable stack 2 locals 1 {
        new    class InterfaceObj;
        dup;
        invokespecial   Method "<init>":"()V";
        invokestatic    Method c:"(LI;)V";
        return;
    }

} // end Class InterfaceObj
