# Copyright 2011-2021 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 anon-ns2.cc

if {[prepare_for_testing "failed to prepare" $testfile "$srcfile $srcfile2" {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'"
    }
}

# PR c++/17976
gdb_test "ptype '(anonymous namespace)'" \
    "type = namespace \\\(anonymous namespace\\\)"

gdb_exit
return 0
