# Copyright 2007, 2009, 2010 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.
#
# PR c++/9489.

if $tracelevel then {
    strace $tracelevel
}

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

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)"

