# 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 main.c missing-sig-type-dw4.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu {} {
 	compile_unit {} {
	    declare_labels typedef_label

	    # This signature is intentionally wrong.
	    typedef_label: typedef {
		{name foo}
		{type 0xee22334455667788 ref_sig8 }
	    }
	}
    }

    tu {} 0x1122334455667788 the_type {
	type_unit {} {
	    the_type: base_type {
		{name int}
		{encoding @DW_ATE_signed}
		{byte_size 4 sdata}
	    }
	}
    }
}

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 foo" "type = <unknown type .*>"
