# Copyright 2010 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/>.

# Check that GDB can call C++ functions whose parameters or return values have
# type containing a static member of the same type.

# Still no C++ compiler is used.
if { [skip_cplus_tests] } { continue }

# This test can only be run on targets which support DWARF-2 and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget *-*-openbsd*]
    && ![istarget arm-*-eabi*]
    && ![istarget powerpc-*-eabi*]} {
    return 0  
}

set testfile "dw2-cp-infcall-ref-static"
if { [prepare_for_testing ${testfile}.exp ${testfile} [list ${testfile}-main.c ${testfile}.S] {}] } {
    return -1
}

if ![runto_main] then {
    return -1
}

# main is not provided by DWARF.
gdb_test_no_output "set language c++"

# There are no mangled names in DWARF to suggest the v3 ABI.
gdb_test_no_output "set cp-abi gnu-v3"

# GDB could crash.  There is no DW_AT_location so it is <optimized out>.
gdb_test "p f()" { = {static s = <optimized out>}}
