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

# When gdb resolves type information for class "derived" from objfile
# gdb2384, it use to fill in the TYPE_VPTR_BASETYPE field with class "base"
# from objfile gdb2384-base.so.  When the program is rerun the type
# information for base-in-so-base.so is discarded leaving
# TYPE_VPTR_BASETYPE dangling.

if $tracelevel then {
    strace $tracelevel
}

if { [skip_cplus_tests] } { continue }
if { [skip_shlib_tests] } { continue }

set prms_id 2384
set bug_id 0

set testfile "gdb2384"
set srcfile ${testfile}.cc
set binfile $objdir/$subdir/$testfile

set libfile "gdb2384-base"
set libsrcfile ${libfile}.cc
set sofile $objdir/$subdir/${libfile}.so

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

if { [gdb_compile_shlib $srcdir/$subdir/$libsrcfile $sofile {debug c++}] != ""
     || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable [list debug "c++" shlib=${sofile}]] != ""} {
    untested gdb2384.exp
    return -1
}

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


if ![runto_main] then {
    perror "couldn't run to breakpoint"
    return -1
}

gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
gdb_continue_to_breakpoint "set breakpoint here"

gdb_test "print d1.meth ()" \
    ".*42.*" \
    "print d1.meth ()"

# Now try again.  gdb's without the fix will hopefully segv here

runto_main
gdb_breakpoint [gdb_get_line_number "set breakpoint here"]
gdb_continue_to_breakpoint "set breakpoint here"
gdb_test "print d1.meth ()" \
    ".*42.*" \
    "gdb2384"

# second case

runto_main
gdb_breakpoint [gdb_get_line_number "set breakpoint here (second)"]
gdb_continue_to_breakpoint "set breakpoint here (second)"
gdb_test "print d2.meth ()" \
    ".*24.*" \
    "print d2.meth()"

runto_main
gdb_breakpoint [gdb_get_line_number "set breakpoint here (second)"]
gdb_continue_to_breakpoint "set breakpoint here (second)"
gdb_test "print d2.meth ()" \
    ".*24.*" \
    "gdb2384 (second)"

