# 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.

if {[skip_cplus_tests]} { continue }

standard_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 types {"void" "int" "char *"}
set methods {}
foreach t $types {
    lappend methods "${ans}::doit1($t)"
    lappend methods "${ans}::one::one($t)"
    lappend methods "${ans}::A::doit2($t)"
    lappend methods "${ans}::A::two::two($t)"
    lappend methods "${ans}::A::${ans}::${ans}::doit3($t)"
    lappend methods "${ans}::A::${ans}::${ans}::three::three($t)"
}

lappend methods "${ans}::one::doit(void)"
lappend methods "${ans}::A::two::doit(void)"
lappend methods "${ans}::A::${ans}::${ans}::three::doit(void)"

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]"

    gdb_test "list $test" $result
    gdb_test "list '$test'" $result
    if {[gdb_breakpoint $test]} {
	pass "break $test"
    }
    if {[gdb_breakpoint '$test']} {
	pass "break '$test'"
    }
}

gdb_exit
return 0
