# Copyright 2013 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/>.
load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0  
}

if { [skip_cplus_tests] } { continue }

standard_testfile .cc method-ptr-dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    declare_labels int_label float_label struct_label
    declare_labels ptr_label subr_label memptr_label

    cu 0 2 8 {
	compile_unit {{language @DW_LANG_C_plus_plus}} {
	    int_label: base_type {
		{name int}
		{encoding @DW_ATE_signed}
		{byte_size 4 DW_FORM_sdata}
	    }

	    float_label: base_type {
		{name float}
		{encoding @DW_ATE_float}
		{byte_size 4 DW_FORM_sdata}
	    }

	    struct_label: structure_type {
		{name S}
		{byte_size 1 DW_FORM_sdata}
	    }

	    ptr_label: pointer_type {
		{type :$struct_label}
	    }

	    subr_label: subroutine_type {
		{type :$int_label}
	    } {
		formal_parameter {
		    {type :$ptr_label}
		    {artificial 1 DW_FORM_flag_present}
		}
		formal_parameter {
		    {type :$float_label}
		}
	    }

	    memptr_label: ptr_to_member_type {
		{type :$subr_label}
		{containing_type :$struct_label}
	    }

	    typedef {
		{name the_typedef}
		{type :$memptr_label}
	    }
	}
    }
}

if  {[gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
	  object {nodebug}] != ""} {
    return -1
}

if  {[gdb_compile $asm_file ${binfile}2.o object {nodebug}] != ""} {
    return -1
}

if  {[gdb_compile [list ${binfile}1.o ${binfile}2.o] \
	  "${binfile}" executable {c++}] != ""} {
    return -1
}

clean_restart ${testfile}

gdb_test "ptype the_typedef" \
    "type = int \\(S::\\*\\)\\(S \\* const, float\\)"
