# Copyright 2003, 2007, 2008, 2009 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/>.

# This file is part of the gdb testsuite

# This is intended to be a repository for tests that partial symbols
# are working properly.  If multiple tests are added, make sure that
# you exit and restart GDB between tests.

if $tracelevel then {
    strace $tracelevel
}

#
# test running programs
#

set prms_id 0
set bug_id 0

if { [skip_cplus_tests] } { continue }

set testfile "psymtab"
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${testfile}1.c" "${testfile}1.o" object {debug}] != "" } {
     untested psymtab.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${testfile}2.c" "${testfile}2.o" object {debug}] != "" } {
     untested psymtab.exp
     return -1
}

if  { [gdb_compile "${testfile}1.o ${testfile}2.o" ${binfile} executable {debug}] != "" } {
     untested psymtab.exp
     return -1
}

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info ${binfile}] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Disable the prompt for whether to set pending breakpoints.
# We don't want a breakpoint, we just want to verify the symbol
# isn't found.
gdb_test "set breakpoint pending off" "" "psymtab pending setup"

# This test is looking for a bug that manifested itself when GDB was
# looking for a partial symbol such that there wasn't such a partial
# symbol in the psymtab, but such that the last psym in the psymtab
# had the right name but the wrong namespace.  Here, searching for
# zzz::dummy currently causes a search for 'zzz' in STRUCT_NAMESPACE
# without a preceding search for 'zzz' in VAR_NAMESPACE.

gdb_test "break zzz::dummy" "Can't find member of namespace, class, struct, or union named \"zzz::dummy\"\r\n.*" "Don't search past end of psymtab."
