# Copyright 1992, 2004-2005, 2007-2012 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/>.  */

# Test case for CLLbs15503
# This file was written by Sue Kimura (sue_kimura@hp.com)
# Rewritten by Michael Chastain (mec.gnu@mindspring.com)

if { [skip_stl_tests] } { continue }

# On SPU this test fails because the executable exceeds local storage size.
if { [istarget "spu*-*-*"] } {
        return 0
}

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

if [get_compiler_info ${binfile}] {
    return -1
}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "debug c++"] != "" } {
    untested bs15503.exp
    return -1
}

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

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

# Set breakpoint on template function

gdb_test "break StringTest<wchar_t>::testFunction" \
    "Breakpoint $decimal at $hex: file .*${srcfile}, line $decimal."

gdb_test "continue" \
    ".*Breakpoint $decimal, StringTest<wchar_t>::testFunction \\(this=$hex\\).*" \
    "continue to StringTest<wchar_t>"

# Run to some random point in the middle of the function.

gdb_breakpoint [gdb_get_line_number "find position where blank needs to be inserted"]
gdb_continue_to_breakpoint "find position where blank needs to be inserted"

# Call some string methods.

gdb_test "print s.length()"		"\\$\[0-9\]+ = 42"
gdb_test "print s\[0\]"			"\\$\[0-9\]+ =.* 'I'"
gdb_test "print s\[s.length()-1\]"	"\\$\[0-9\]+ =.* 'g'"
gdb_test "print (const char *) s" \
    "\\$\[0-9\]+ = $hex \"I am a short stringand now a longer string\""

# TODO: tests that do not work with gcc 2.95.3
# -- chastain 2004-01-07
# 
# gdb_test "print s.compare(s)"		"\\$\[0-9\]+ = 0"
# gdb_test "print s.compare(\"AAA\")"     "\\$\[0-9\]+ = 1"
# gdb_test "print s.compare(\"ZZZ\")"     "\\$\[0-9\]+ = -1"

# TODO: tests that do not work with gcc 2.95.3 and gcc 3.3.2.
# cannot call overloaded non-member operator.  -- chastain 2004-01-07
# 
# gdb_test "print s == s"			"\\$\[0-9\]+ = true"
# gdb_test "print s > "AAA"			"\\$\[0-9\]+ = true"
# gdb_test "print s < "ZZZ"			"\\$\[0-9\]+ = true"

# TODO: GDB doesn't know to convert the string to a const char *, and
# instead tries to use the string as a structure initializer.
# 
# gdb_test "print s == \"I am a short stringand now a longer string\"" \
#     "\\$\[0-9\]+ = true"

gdb_test "print (const char *) s.substr(0,4)"	"\\$\[0-9\]+ = $hex \"I am\""
gdb_test "print (const char *) (s=s.substr(0,4))" \
    "\\$\[0-9\]+ = $hex \"I am\""

# TODO: cannot call overloaded non-member operator again.
# -- chastain 2004-01-07
# 
# gdb_test "print (const char *) (s + s)" \
#    "\\$\[0-9\]+ = $hex \"I amI am\""
# gdb_test "print (const char *) (s + \" \" + s)" \
#    "\\$\[0-9\]+ = $hex \"I am I am\""
