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

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
set testfile "ovsrch"
set binfile [file join $objdir $subdir $testfile]

set srcfiles {}
for {set i 1} {$i < 5} {incr i} {
    lappend srcfiles $testfile$i.cc
}

if {[prepare_for_testing $testfile $testfile $srcfiles {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
