/* This testcase is part of GDB, the GNU debugger.

   Copyright 2010-2026 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program 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 for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* The goal of this test is to provide anonymous DW_TAG_structure_type
   containing __pfn + __delta (read in by quirk_gcc_member_function_pointer)
   before DW_TAG_structure_type of "class C" to exploit the forward reference
   through "__pfn" and back from DW_TAG_member "fp" of "class C".  As the
   compiler may place the DIEs in arbitrary order they are rather prepared as
   a .S file.

   class C;
   typedef int (C::*fp_t) ();
   fp_t fp;
   class C
     {
       int (C::*fp) ();
     } c;  */

	.file	"member-ptr-forwardref.cc"
	.section	.debug_abbrev,"",%progbits
.Ldebug_abbrev0:
	.section	.debug_info,"",%progbits
.Ldebug_info0:
	.section	.debug_line,"",%progbits
.Ldebug_line0:
	.text
.Ltext0:
.globl fp
	.data
	.align 4
	.type	fp, %object
	.size	fp, 8
fp:
	.zero	8
.globl c
	.align 4
	.type	c, %object
	.size	c, 8
c:
	.zero	8
	.text
.Letext0:
	.file 1 "gdb.dwarf2/member-ptr-forwardref.cc"
	.section	.debug_info
	.4byte	0xa9	/* Length of Compilation Unit Info */
	.2byte	0x3	/* DWARF version number */
	.4byte	.Ldebug_abbrev0	/* Offset Into Abbrev. Section */
	.byte	0x4	/* Pointer Size (in bytes) */
	.uleb128 0x1	/* (DIE (0xb) DW_TAG_compile_unit) */
	.4byte	.LASF2	/* DW_AT_producer: "GNU C++ 4.4.2 20091222 (Red Hat 4.4.2-20)" */
	.byte	0x4	/* DW_AT_language */
	.4byte	.LASF3	/* DW_AT_name: "gdb.dwarf2/member-ptr-forwardref.cc" */
	.4byte	.LASF4	/* DW_AT_comp_dir: "gdb/testsuite" */
	.4byte	.Ltext0	/* DW_AT_low_pc */
	.4byte	.Letext0	/* DW_AT_high_pc */
	.4byte	.Ldebug_line0	/* DW_AT_stmt_list */
	.uleb128 0x2	/* (DIE (0x25) DW_TAG_typedef) */
	.4byte	.LASF5	/* DW_AT_name: "fp_t" */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x13	/* DW_AT_decl_line */
	.4byte	0x30	/* DW_AT_type */
	.uleb128 0x3	/* (DIE (0x30) DW_TAG_structure_type) */
	.byte	0x8	/* DW_AT_byte_size */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x13	/* DW_AT_decl_line */
	.4byte	0x51	/* DW_AT_sibling */
	.uleb128 0x4	/* (DIE (0x38) DW_TAG_member) */
	.4byte	.LASF0	/* DW_AT_name: "__pfn" */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x13	/* DW_AT_decl_line */
	.4byte	0x85	/* DW_AT_type */
	.sleb128 0	/* DW_AT_data_member_location */
	.uleb128 0x4	/* (DIE (0x44) DW_TAG_member) */
	.4byte	.LASF1	/* DW_AT_name: "__delta" */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x13	/* DW_AT_decl_line */
	.4byte	0x61	/* DW_AT_type */
	.sleb128 4	/* DW_AT_data_member_location */
	.byte	0x0	/* end of children of DIE 0x30 */
	.uleb128 0x5	/* (DIE (0x51) DW_TAG_subroutine_type) */
	.4byte	0x61	/* DW_AT_type */
	.4byte	0x61	/* DW_AT_sibling */
	.uleb128 0x6	/* (DIE (0x5a) DW_TAG_formal_parameter) */
	.4byte	0x68	/* DW_AT_type */
	.byte	0x1	/* DW_AT_artificial */
	.byte	0x0	/* end of children of DIE 0x51 */
	.uleb128 0x7	/* (DIE (0x61) DW_TAG_base_type) */
	.byte	0x4	/* DW_AT_byte_size */
	.byte	0x5	/* DW_AT_encoding */
	.ascii "int\0"	/* DW_AT_name */
	.uleb128 0x8	/* (DIE (0x68) DW_TAG_pointer_type) */
	.byte	0x4	/* DW_AT_byte_size */
	.4byte	0x6e	/* DW_AT_type */
	.uleb128 0x9	/* (DIE (0x6e) DW_TAG_structure_type) */
	.ascii "C\0"	/* DW_AT_name */
	.byte	0x8	/* DW_AT_byte_size */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x16	/* DW_AT_decl_line */
	.4byte	0x85	/* DW_AT_sibling */
	.uleb128 0xa	/* (DIE (0x78) DW_TAG_member) */
	.ascii "fp\0"	/* DW_AT_name */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x17	/* DW_AT_decl_line */
	.4byte	0x30	/* DW_AT_type */
	.sleb128 0	/* DW_AT_data_member_location */
	.byte	0x3	/* DW_AT_accessibility */
	.byte	0x0	/* end of children of DIE 0x6e */
	.uleb128 0x8	/* (DIE (0x85) DW_TAG_pointer_type) */
	.byte	0x4	/* DW_AT_byte_size */
	.4byte	0x51	/* DW_AT_type */
	.uleb128 0xb	/* (DIE (0x8b) DW_TAG_variable) */
	.ascii "fp\0"	/* DW_AT_name */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x14	/* DW_AT_decl_line */
	.4byte	0x25	/* DW_AT_type */
	.byte	0x1	/* DW_AT_external */
	.byte	0x5	/* DW_AT_location */
	.byte	0x3	/* DW_OP_addr */
	.4byte	fp
	.uleb128 0xb	/* (DIE (0x9c) DW_TAG_variable) */
	.ascii "c\0"	/* DW_AT_name */
	.byte	0x1	/* DW_AT_decl_file (gdb.dwarf2/member-ptr-forwardref.cc) */
	.byte	0x18	/* DW_AT_decl_line */
	.4byte	0x6e	/* DW_AT_type */
	.byte	0x1	/* DW_AT_external */
	.byte	0x5	/* DW_AT_location */
	.byte	0x3	/* DW_OP_addr */
	.4byte	c
	.byte	0x0	/* end of children of DIE 0xb */
	.section	.debug_abbrev
	.uleb128 0x1	/* (abbrev code) */
	.uleb128 0x11	/* (TAG: DW_TAG_compile_unit) */
	.byte	0x1	/* DW_children_yes */
	.uleb128 0x25	/* (DW_AT_producer) */
	.uleb128 0xe	/* (DW_FORM_strp) */
	.uleb128 0x13	/* (DW_AT_language) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0xe	/* (DW_FORM_strp) */
	.uleb128 0x1b	/* (DW_AT_comp_dir) */
	.uleb128 0xe	/* (DW_FORM_strp) */
	.uleb128 0x11	/* (DW_AT_low_pc) */
	.uleb128 0x1	/* (DW_FORM_addr) */
	.uleb128 0x12	/* (DW_AT_high_pc) */
	.uleb128 0x1	/* (DW_FORM_addr) */
	.uleb128 0x10	/* (DW_AT_stmt_list) */
	.uleb128 0x6	/* (DW_FORM_data4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x2	/* (abbrev code) */
	.uleb128 0x16	/* (TAG: DW_TAG_typedef) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0xe	/* (DW_FORM_strp) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x3	/* (abbrev code) */
	.uleb128 0x13	/* (TAG: DW_TAG_structure_type) */
	.byte	0x1	/* DW_children_yes */
	.uleb128 0xb	/* (DW_AT_byte_size) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x1	/* (DW_AT_sibling) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x4	/* (abbrev code) */
	.uleb128 0xd	/* (TAG: DW_TAG_member) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0xe	/* (DW_FORM_strp) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.uleb128 0x38	/* (DW_AT_data_member_location) */
	.uleb128 0xd	/* (DW_FORM_sdata) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x5	/* (abbrev code) */
	.uleb128 0x15	/* (TAG: DW_TAG_subroutine_type) */
	.byte	0x1	/* DW_children_yes */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.uleb128 0x1	/* (DW_AT_sibling) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x6	/* (abbrev code) */
	.uleb128 0x5	/* (TAG: DW_TAG_formal_parameter) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.uleb128 0x34	/* (DW_AT_artificial) */
	.uleb128 0xc	/* (DW_FORM_flag) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x7	/* (abbrev code) */
	.uleb128 0x24	/* (TAG: DW_TAG_base_type) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0xb	/* (DW_AT_byte_size) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3e	/* (DW_AT_encoding) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0x8	/* (DW_FORM_string) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x8	/* (abbrev code) */
	.uleb128 0xf	/* (TAG: DW_TAG_pointer_type) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0xb	/* (DW_AT_byte_size) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0x9	/* (abbrev code) */
	.uleb128 0x13	/* (TAG: DW_TAG_structure_type) */
	.byte	0x1	/* DW_children_yes */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0x8	/* (DW_FORM_string) */
	.uleb128 0xb	/* (DW_AT_byte_size) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x1	/* (DW_AT_sibling) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.byte	0x0
	.byte	0x0
	.uleb128 0xa	/* (abbrev code) */
	.uleb128 0xd	/* (TAG: DW_TAG_member) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0x8	/* (DW_FORM_string) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.uleb128 0x38	/* (DW_AT_data_member_location) */
	.uleb128 0xd	/* (DW_FORM_sdata) */
	.uleb128 0x32	/* (DW_AT_accessibility) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.byte	0x0
	.byte	0x0
	.uleb128 0xb	/* (abbrev code) */
	.uleb128 0x34	/* (TAG: DW_TAG_variable) */
	.byte	0x0	/* DW_children_no */
	.uleb128 0x3	/* (DW_AT_name) */
	.uleb128 0x8	/* (DW_FORM_string) */
	.uleb128 0x3a	/* (DW_AT_decl_file) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x3b	/* (DW_AT_decl_line) */
	.uleb128 0xb	/* (DW_FORM_data1) */
	.uleb128 0x49	/* (DW_AT_type) */
	.uleb128 0x13	/* (DW_FORM_ref4) */
	.uleb128 0x3f	/* (DW_AT_external) */
	.uleb128 0xc	/* (DW_FORM_flag) */
	.uleb128 0x2	/* (DW_AT_location) */
	.uleb128 0xa	/* (DW_FORM_block1) */
	.byte	0x0
	.byte	0x0
	.byte	0x0
	.section	.debug_pubnames,"",%progbits
	.4byte	0x1b	/* Length of Public Names Info */
	.2byte	0x2	/* DWARF Version */
	.4byte	.Ldebug_info0	/* Offset of Compilation Unit Info */
	.4byte	0xad	/* Compilation Unit Length */
	.4byte	0x8b	/* DIE offset */
	.ascii "fp\0"	/* external name */
	.4byte	0x9c	/* DIE offset */
	.ascii "c\0"	/* external name */
	.4byte	0x0
	.section	.debug_pubtypes,"",%progbits
	.4byte	0x1d	/* Length of Public Type Names Info */
	.2byte	0x2	/* DWARF Version */
	.4byte	.Ldebug_info0	/* Offset of Compilation Unit Info */
	.4byte	0xad	/* Compilation Unit Length */
	.4byte	0x25	/* DIE offset */
	.ascii "fp_t\0"	/* external name */
	.4byte	0x6e	/* DIE offset */
	.ascii "C\0"	/* external name */
	.4byte	0x0
	.section	.debug_str,"MS",%progbits,1
.LASF5:
	.string	"fp_t"
.LASF2:
	.string	"GNU C++ 4.4.2 20091222 (Red Hat 4.4.2-20)"
.LASF0:
	.string	"__pfn"
.LASF4:
	.string	"gdb/testsuite"
.LASF3:
	.string	"gdb.dwarf2/member-ptr-forwardref.cc"
.LASF1:
	.string	"__delta"
	.ident	"GCC: (GNU) 4.4.2 20091222 (Red Hat 4.4.2-20)"
	.section	.note.GNU-stack,"",%progbits
