/*
 * Copyright (c) 2014, 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 file contains ten different sub-tests.  Each sub-test consists of a
 * class with a different case of an invalid duplicate attribute.  The main
 * test runs each of these tests individually.  If any of them fail then the
 * whole test fails.
 */



/*
 * This test contains a class with invalid duplicate AnnotationDefault attributes.
 */
class AnnotationDefaultDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "AnnotationDefault"; // #9
    Utf8 "LAnnotationDefaultI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "AnnotationDefaultDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "AnnotationDefaultDupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
        ;

        Attr(#9) { // AnnotationDefault
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end AnnotationDefault
    // wrong:
        ;
        Attr(#9) { // AnnotationDefault
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end AnnotationDefault
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // AnnotationDefault
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end AnnotationDefault
  } // Attributes

} // end class



/*
 * This test contains a class with invalid duplicate RuntimeInvisibleAnnotations
 * attributes.
 */
class ClassInvisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "RuntimeInvisibleAnnotations"; // #9
    Utf8 "LClassInvisAnnotsI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "ClassInvisAnnotsDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "ClassInvisAnnotsDupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // RuntimeInvisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeInvisibleAnnotations
// wrong:
    ;
    Attr(#9) { // RuntimeInvisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeInvisibleAnnotations
// end wrong
  } // Attributes

} // end class



/*
 * This test contains a class with invalid duplicate RuntimeVisibleAnnotations
 * attributes.
 */
class ClassVisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "RuntimeVisibleAnnotations"; // #9
    Utf8 "LClassVisAnnotsI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "ClassVisAnnotsDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "ClassVisAnnotsDupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // RuntimeVisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeVisibleAnnotations
// wrong:
    ;
    Attr(#9) { // RuntimeVisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeVisibleAnnotations
// end wrong
  } // Attributes

} // end class



/*
 * This test contains a field with invalid duplicate RuntimeInvisibleAnnotations
 * attributes.
 */
class FieldInvisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #4 #16; // #1
    Method #17 #18; // #2
    class #19; // #3
    class #20; // #4
    Utf8 "fld"; // #5
    Utf8 "Ljava/util/ArrayList;"; // #6
    Utf8 "Signature"; // #7
    Utf8 "Ljava/util/ArrayList<Ljava/lang/Object;>;"; // #8
    Utf8 "RuntimeInvisibleAnnotations"; // #9
    Utf8 "LFieldInvisAnnotsI;"; // #10
    Utf8 "<init>"; // #11
    Utf8 "()V"; // #12
    Utf8 "Code"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #11 #12; // #16
    class #21; // #17
    NameAndType #14 #15; // #18
    Utf8 "FieldInvisAnnotsDup"; // #19
    Utf8 "java/lang/Object"; // #20
    Utf8 "FieldInvisAnnotsDupChecker"; // #21
  } // Constant Pool

  0x0021; // access
  #3;// this_cpx
  #4;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
    { // Member
      0x0001; // access
      #5; // name_cpx
      #6; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Signature
          #8;
        } // end Signature
        ;
        Attr(#9) { // RuntimeInvisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeInvisibleAnnotations
    // wrong:
        ;
        Attr(#9) { // RuntimeInvisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeInvisibleAnnotations
    // end wrong
      } // Attributes
    } // Member
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #11; // name_cpx
      #12; // sig_cpx
      [] { // Attributes
        Attr(#13) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#13) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80002AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
  } // Attributes
} // end class



/*
 * This test contains a field with invalid duplicate RuntimeVisibleAnnotations
 * attributes.
 */
class FieldVisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #4 #16; // #1
    Method #17 #18; // #2
    class #19; // #3
    class #20; // #4
    Utf8 "fld"; // #5
    Utf8 "Ljava/util/ArrayList;"; // #6
    Utf8 "Signature"; // #7
    Utf8 "Ljava/util/ArrayList<Ljava/lang/Object;>;"; // #8
    Utf8 "RuntimeVisibleAnnotations"; // #9
    Utf8 "LFieldVisAnnotsI;"; // #10
    Utf8 "<init>"; // #11
    Utf8 "()V"; // #12
    Utf8 "Code"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #11 #12; // #16
    class #21; // #17
    NameAndType #14 #15; // #18
    Utf8 "FieldVisAnnotsDup"; // #19
    Utf8 "java/lang/Object"; // #20
    Utf8 "FieldVisAnnotsDupChecker"; // #21
  } // Constant Pool

  0x0021; // access
  #3;// this_cpx
  #4;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
    { // Member
      0x0001; // access
      #5; // name_cpx
      #6; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Signature
          #8;
        } // end Signature
        ;
        Attr(#9) { // RuntimeVisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeVisibleAnnotations
    // wrong:
        ;
        Attr(#9) { // RuntimeVisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeVisibleAnnotations
    // end wrong
      } // Attributes
    } // Member
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #11; // name_cpx
      #12; // sig_cpx
      [] { // Attributes
        Attr(#13) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#13) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80002AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
  } // Attributes
} // end class



/*
 * This test contains a method with invalid duplicate RuntimeInvisibleAnnotations
 * attributes.
 */
class MethInvisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "RuntimeInvisibleAnnotations"; // #9
    Utf8 "LMethInvisAnnotsI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "MethInvisAnnotsDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "MethInvisAnnotsDupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
        ;

        Attr(#9) { // RuntimeInvisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeInvisibleAnnotations
    // wrong:
        ;
        Attr(#9) { // RuntimeInvisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeInvisibleAnnotations
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // RuntimeInvisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeInvisibleAnnotations
  } // Attributes

} // end class



/*
 * This test contains a method with invalid duplicate
 * RuntimeInvisibleParameterAnnotations attributes.
 */
class MethInvisParamAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #4 #16; // #1
    Method #17 #18; // #2
    class #19; // #3
    class #20; // #4
    Utf8 "<init>"; // #5
    Utf8 "()V"; // #6
    Utf8 "Code"; // #7
    Utf8 "m"; // #8
    Utf8 "()I"; // #9
    Utf8 "Signature"; // #10
    Utf8 "<T:Ljava/lang/Object;>()I"; // #11
    Utf8 "RuntimeInvisibleParameterAnnotations"; // #12
    Utf8 "LMethInvisParamAnnotsI;"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #5 #6; // #16
    class #21; // #17
    NameAndType #14 #15; // #18
    Utf8 "MethInvisParamAnnotsDup"; // #19
    Utf8 "java/lang/Object"; // #20
    Utf8 "MethInvisParamAnnotsDupChecker"; // #21
  } // Constant Pool

  0x0021; // access
  #3;// this_cpx
  #4;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #5; // name_cpx
      #6; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0001; // access
      #8; // name_cpx
      #9; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x03AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
        ;
        Attr(#10) { // Signature
          #11;
        } // end Signature
        ;
        Attr(#12) { // RuntimeInvisibleParameterAnnotations
          0x0001010000000D00;
          0x00;
        } // end RuntimeInvisibleParameterAnnotations
// wrong:
        ;
        Attr(#12) { // RuntimeInvisibleParameterAnnotations
          0x0001010000000D00;
          0x00;
        } // end RuntimeInvisibleParameterAnnotations
// end wrong
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80002AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
  } // Attributes
} // end class



/*
 * This test contains a method with invalid duplicate RuntimeVisibleAnnotations
 * attributes.
 */
class MethVisAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "RuntimeVisibleAnnotations"; // #9
    Utf8 "LMethodVisAnnotsDupI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "MethVisAnnotsDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "MethVisAnnotsDupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
        ;

        Attr(#9) { // RuntimeVisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeVisibleAnnotations
    // wrong:
        ;
        Attr(#9) { // RuntimeVisibleAnnotations
          [] { // type annotations
            { // type annotation
              0x00;  // target_type
              0x00;  // type_parameter_index
              []b { //  type_path
              }

              #10; // type_index
              [] { // element_value_pairs
              } // element_value_pairs
            } // type annotation
          } // type annotations
        } // end RuntimeVisibleAnnotations
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // RuntimeVisibleAnnotations
      [] { // type annotations
        { // type annotation
          0x00;  // target_type
          0x00;  // type_parameter_index
          []b { //  type_path
          }

          #10; // type_index
          [] { // element_value_pairs
          } // element_value_pairs
        } // type annotation
      } // type annotations
    } // end RuntimeVisibleAnnotations
  } // Attributes

} // end class



/*
 * This test contains a method with invalid duplicate
 * RuntimeVisibleParameterAnnotations attributes.
 */
class MethVisParamAnnotsDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #4 #16; // #1
    Method #17 #18; // #2
    class #19; // #3
    class #20; // #4
    Utf8 "<init>"; // #5
    Utf8 "()V"; // #6
    Utf8 "Code"; // #7
    Utf8 "m"; // #8
    Utf8 "()I"; // #9
    Utf8 "Signature"; // #10
    Utf8 "<T:Ljava/lang/Object;>()I"; // #11
    Utf8 "RuntimeVisibleParameterAnnotations"; // #12
    Utf8 "LMethVisParamAnnotsI;"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #5 #6; // #16
    class #21; // #17
    NameAndType #14 #15; // #18
    Utf8 "MethVisParamAnnotsDup"; // #19
    Utf8 "java/lang/Object"; // #20
    Utf8 "MethVisParamAnnotsDupChecker"; // #21
  } // Constant Pool

  0x0021; // access
  #3;// this_cpx
  #4;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #5; // name_cpx
      #6; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0001; // access
      #8; // name_cpx
      #9; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x03AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
        ;
        Attr(#10) { // Signature
          #11;
        } // end Signature
        ;
        Attr(#12) { // RuntimeVisibleParameterAnnotations
          0x0001010000000D00;
          0x00;
        } // end RuntimeVisibleParameterAnnotations
// wrong:
        ;
        Attr(#12) { // RuntimeVisibleParameterAnnotations
          0x0001010000000D00;
          0x00;
        } // end RuntimeVisibleParameterAnnotations
// end wrong
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#7) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80002AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
  } // Attributes
} // end class



/*
 * This test contains a method with invalid duplicate SourceDebugExtension
 * attributes.
 */
class SrcDbgExtDup {
  0xCAFEBABE;
  0; // minor version
  52; // version
  [] { // Constant Pool
    ; // first element is empty
    Method #3 #11; // #1
    class #12; // #2
    class #13; // #3
    Utf8 "<init>"; // #4
    Utf8 "()V"; // #5
    Utf8 "Code"; // #6
    Utf8 "Signature"; // #7
    Utf8 "<T:Ljava/lang/Object;>Ljava/lang/Object;"; // #8
    Utf8 "SourceDebugExtension"; // #9
    Utf8 "LSrcDbgExtDupI;"; // #10
    NameAndType #4 #5; // #11
    Utf8 "SrcDbgExtDup"; // #12
    Utf8 "java/lang/Object"; // #13
    Utf8 "run"; // #14
    Utf8 "([Ljava/lang/String;Ljava/io/PrintStream;)I"; // #15
    NameAndType #14 #15; // #16
    class #19; // #17
    Method #17 #16; // #18
    Utf8 "SrcDbgExt_dupChecker"; // #19
  } // Constant Pool

  0x0021; // access
  #2;// this_cpx
  #3;// super_cpx

  [] { // Interfaces
  } // Interfaces

  [] { // fields
  } // fields

  [] { // methods
    { // Member
      0x0001; // access
      #4; // name_cpx
      #5; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          1; // max_stack
          1; // max_locals
          Bytes[]{
            0x2AB70001B1;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
    ;
    { // Member
      0x0009; // access
      #14; // name_cpx
      #15; // sig_cpx
      [] { // Attributes
        Attr(#6) { // Code
          2; // max_stack
          2; // max_locals
          Bytes[]{
            0x2A2BB80012AC;
          };
          [] { // Traps
          } // end Traps
          [] { // Attributes
          } // Attributes
        } // end Code
      } // Attributes
    } // Member
  } // methods

  [] { // Attributes
    Attr(#7) { // Signature
      #8;
    } // end Signature
    ;
    Attr(#9) { // SourceDebugExtension
      [] { // debug_extensions
        { // type debug_extension
          []b { //  type_path
          }
        } // type debug_extension
      } // type debug_extensions
    } // end SourceDebugExtension
// wrong:
    ;
    Attr(#9) { // SourceDebugExtension
      [] { // debug_extensions
        { // type debug_extension
          []b { //  type_path
          }
        } // type debug_extension
      } // type debug_extensions
    } // end SourceDebugExtension
// end wrong
  } // Attributes

} // end class
