# Copyright 2011 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
set testfile "static-method"
set srcfile $testfile.cc

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

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.
    gdb_test "list ${srcfile}:$test" $result
    gdb_test "list '${srcfile}:$test'" $result
    gdb_test "list '${srcfile}':'$test'" $result
    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
