# Copyright 2011-2013 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 }

# Tests for c++/12273, breakpoint/12803
standard_testfile .cc

# Do NOT compile with debug flag.
if {[prepare_for_testing $testfile $testfile $srcfile {c++}]} {
    return -1
}

# Before setting the language, try to set a few simple breakpoints
set min_syms [list \
		  "GDB<int>::a() const" \
		  "GDB<int>::b() volatile" \
		  "GDB<int>::c() const volatile"]
foreach sym $min_syms {
    set tst "setting breakpoint at '$sym'"
    if {[gdb_breakpoint "'$sym'"]} {
	pass $tst
    }    
}


gdb_test_no_output "set language c++"

# A list of minimal symbol names to check.
# Note that GDB<char>::even_harder<int>(char) is quoted and includes
# the return type.  This is necessary because this is the demangled name
# of the minimal symbol.
set min_syms [list \
		  "GDB<int>::operator ==" \
		  "GDB<int>::operator==(GDB<int> const&)" \
		  "GDB<char>::harder(char)" \
		  "GDB<int>::harder(int)" \
		  {"int GDB<char>::even_harder<int>(char)"} \
		  "GDB<int>::simple()"]

foreach sym $min_syms {
    set tst "setting breakpoint at $sym"
    if {[gdb_breakpoint $sym]} {
	pass $tst
    }
}

gdb_exit
