# Copyright (C) 2011 Free Software Foundation, Inc.
#
# 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/>.

# The goal is to have class with full DWARF symbols present in one file having
# only a declaration there for the method.  The method is then defined in
# a different file providing only ELF symbols.

set testfile minsym-fallback
set srcfile ${testfile}.cc
set srcmainfile ${testfile}-main.cc
set executable $testfile
set objfile $objdir/$subdir/${testfile}.o
set objmainfile $objdir/$subdir/${testfile}-main.o
set binfile $objdir/$subdir/$executable
if {[gdb_compile $srcdir/$subdir/$srcfile $objfile object {}] != ""
    || [gdb_compile $srcdir/$subdir/$srcmainfile $objmainfile object {debug}] != ""
    || [gdb_compile "$objfile $objmainfile" $binfile executable {c++}] != ""} {
    untested ${testfile}.exp
    return -1
}

clean_restart ${executable}

gdb_test_no_output "set breakpoint pending off"

gdb_test "break C::f()" {Breakpoint [0-9]+ at 0x[0-9a-f]+}

gdb_test "break C::operator()()" {Breakpoint [0-9]+ at 0x[0-9a-f]+}
