# Copyright (C) 1992 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Test case for CLLbs15503
# This file was written by Sue Kimura (sue_kimura@hp.com)

if $tracelevel {
    strace $tracelevel
}

if { [skip_hp_tests] } { continue }

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

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

# The testcode is non-conforming and rejected by GCC.  So bypass this
# test completely unless we're compiling with HP's compiler.
if {!$hp_aCC_compiler && !$hp_cc_compiler} {
  return 0
}
    
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug c++"] != "" } {
    perror "Couldn't compile ${srcfile}"
    return -1
}


# Start with a fresh gdb.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

#  Load $binfile -- there should be no warnings about "Procedure ... spans 
#  file or module boundaries", "No symbols in psymtab for file ..." or 
#  "File ... has ending address after starting address of next file..."

if [istarget "hppa64-hp-hpux*" ] {
    gdb_test "file $binfile" \
        "Detected 64-bit executable..*Invoking .*gdb64..*Use \"run\" to continue execution." \
        "loading $binfile"
} else {
    gdb_test "file $binfile" \
        "Reading symbols from $binfile...done." \
        "loading $binfile"
}
#  Test setting breakpoint on template function
#
gdb_test "break StringTest<wchar_t>::testFunction" \
    "Breakpoint $decimal at $hex: file .*bs15503.cc, line 19." \
    "break point on function"

gdb_test "run" \
    "Starting program:.*Breakpoint $decimal, StringTest<wchar_t>::testFunction \\(this=$hex\\).*cout << \"in StringTest\" << endl;.*" \
    "run to function breakpoint"

#restart with fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

gdb_test "break 32" \
    "Breakpoint $decimal at $hex: file .*bs15503.cc, line 32." \
    "break point on line in function"

gdb_test "run" \
    ".*32.*string::size_type spos = s.find\\(\"and\"\\);.*" \
    "run to break point on line in function"
