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

proc test_class {class} {

    # An array holding the overload types for the methods A::outer::foo
    # and A::B::inner::foo.  The first element is the overloaded method
    # parameter.  The second element is the expected source file number,
    # e.g. "ovsrch?.cc".
    array set tests {
	"char*"  4
	"int"    3
	"void"   2
    }

    # Test each overload instance twice: once quoted, once unquoted
    set conditional1 "if (a_param == 3)"
    set conditional2 "if (A::outer::func ())"
    foreach ovld [array names tests] {
	set method "${class}::foo  ($ovld)  const"
	set result "Breakpoint (\[0-9\]).*file .*ovsrch$tests($ovld).*"
	gdb_test "break $method" $result
	gdb_test "break '$method'" $result

	# Also test with a conditional tacked onto the end.
	if {[string compare $ovld "void"] != 0} {
	    gdb_test "break $method $conditional1" $result
	    gdb_test "break '$method' $conditional1" $result
	    gdb_test "break $method $conditional2" $result
	    gdb_test "break '$method' $conditional2" $result
	}
    }

    # Test whether open parentheses are correctly identified as overload
    # information or conditional.
    gdb_test "break ${class}::hibob if (a_param == 3)" "Breakpoint (\[0-9\]).*"
}

if { [skip_cplus_tests] } { continue }

# Test for c++/11734
standard_testfile ovsrch1.cc ovsrch2.cc ovsrch3.cc ovsrch4.cc

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2 $srcfile3 $srcfile4] {c++ debug}]} {
    return -1
}

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

# Break in A::stop_here and run tests.
if {[gdb_breakpoint "A::stop_here"]} {
    pass "break A::stop_here"
}

if {[gdb_breakpoint "'A::stop_here'"]} {
    pass "break 'A::stop_here'"
}

gdb_continue_to_breakpoint "stop_here"
test_class A::outer

# Break in A::B::stop_here_too and run tests.
if {[gdb_breakpoint "A::B::stop_here_too"]} {
    pass "break A::B::stop_here_too"
}

if {[gdb_breakpoint "'A::B::stop_here_too'"]} {
    pass "break 'A::B::stop_here_too'"
}

gdb_continue_to_breakpoint "stop_here_too"
test_class A::B::inner

gdb_exit
return 0
