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