# Copyright 2011-2012 Free Software Foundation, Inc.
#
# Contributed by Red Hat, originally written by Keith Seitz.
#
# 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/>.

# This file is part of the gdb testsuite.

# A helper proc which sets a breakpoint at FUNC and attempts to
# run to the breakpoint.
proc test_breakpoint {func result} {
    set DEC {[0-9]}

    # Return to the top of the test function every time.
    delete_breakpoints
    if {![gdb_breakpoint test_function]} {
        fail "set test_function breakpoint for $func"
    } elseif {[gdb_test "continue" \
		   "Continuing.\r\n\r\nBreakpoint $DEC+,.*test_function.*" \
		   ""] != 0} {
        fail "continue to test_function for $func"
    } else {
        gdb_breakpoint "$func"
        gdb_test "continue" \
            "Continuing.\r\n\r\nBreakpoint $DEC+,.*$result.*" \
            "continue to $func"
    }
}

if {[skip_cplus_tests]} { continue }

# Tests for c++/12750
standard_testfile .cc

if {[prepare_for_testing $testfile $testfile $srcfile {c++ debug}]} {
    return -1
}

# The GDB workaround for GCC PR debug/45682 does not apply as it requires
# DW_AT_linkage_name of methods.  The whole class A is in anonymous namespace,
# therefore not accessible outside of the CU (compilation unit) and therefore
# GCC does not produce DW_AT_linkage_name for such methods.

set have_gcc_45682_fixed 1
set test "info addr A::func()"
gdb_test_multiple $test $test {
    -re "No symbol \"A::func\\(\\)\" in current context\\.\r\n$gdb_prompt $" {
	pass $test
    }
    -re "Symbol \"A::func\\(\\)\" is a function at address .*\r\n$gdb_prompt $" {
	setup_xfail gcc/45682 "*-*-*"
	fail $test
	set have_gcc_45682_fixed 0
    }
}

if {![runto_main]} {
    perror "couldn't run to breakpoint"
    continue
}

set ans {(anonymous namespace)}
set methods {}
lappend methods "xxx::${ans}::func"
lappend methods "xxx::${ans}::A::func"

gdb_test_no_output "set listsize 1" ""

foreach test $methods {
    # The result we expect is the source code name of the symbol,
    # i.e., without "(anonymous namespace)".
    regsub -all [string_to_regexp "${ans}::"] $test "" expected
    set result ".*// [string_to_regexp $expected]"

    # Test whether the function/method can be "list"ed
    # with the filename pre-pended.
    if {[string compare $test "xxx::${ans}::A::func"] == 0
	&& !$have_gcc_45682_fixed} {
	setup_xfail gcc/45682 "*-*-*"
    }
    gdb_test "list ${srcfile}:$test" $result
    if {[string compare $test "xxx::${ans}::A::func"] == 0
	&& !$have_gcc_45682_fixed} {
	setup_xfail gcc/45682 "*-*-*"
    }
    gdb_test "list '${srcfile}:$test'" $result
    if {[string compare $test "xxx::${ans}::A::func"] == 0
	&& !$have_gcc_45682_fixed} {
	setup_xfail gcc/45682 "*-*-*"
    }
    gdb_test "list '${srcfile}':'$test'" $result
    if {[string compare $test "xxx::${ans}::A::func"] == 0
	&& !$have_gcc_45682_fixed} {
	setup_xfail gcc/45682 "*-*-*"
    }
    gdb_test "list ${srcfile}:'$test'" $result

    # Test setting and hitting a breakoint at the function/method.
    test_breakpoint $test $expected
    test_breakpoint "'$test'" $expected
}

gdb_exit
return 0
