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

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 $testfile $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
