# Copyright 2004-2013 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 was written by Jeff Johnston. (jjohnstn@redhat.com)
#

load_lib "java.exp"

if { [skip_java_tests] } { continue }

standard_testfile .java
if {[compile_java_from_source $srcdir/$subdir/$srcfile $binfile "-g"] != ""} {
    continue
}


# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

gdb_test "set print sevenbit-strings" ".*"

if [set_lang_java] then {
    # Ref PR gdb:java/1565.  Don't use the simpler "break jmisc.main".
    # As of 2004-02-24 it wasn't working and is being tested separatly.
    # Before GCJ 4.1 (approximately) the demangled name did not include
    # a method signature; after that point it does include a trailing
    # signature.
    runto_main
    set function "${testfile}.main(java.lang.String\[\])"
    gdb_breakpoint "$function" allow-pending
    gdb_breakpoint "${function}void" allow-pending
    gdb_continue_to_breakpoint $function

    gdb_test "p jvclass.addprint(4,5,6)" " = 15" "unambiguous static call"

    gdb_test "next" ""
    gdb_test "next" ""

    gdb_test "p x.print(44)" " = 44" "single argument call"
    gdb_test "p x.print(22,33)" " = 33" "double argument call"
    gdb_test "p x.dothat(55)" " = 62.*" "virtual fn call"
    gdb_test "p x.addprint(1,2,3)" "= 6" "inherited static call"
    gdb_test "p x.addk(44)" " = 121" "inherited virtual fn call"

    # Regression test for a crasher.
    # GCC does not output location information for static class members,
    # so GDB will report these as "optimized out". See gcc/43260.
    setup_xfail *-*-* gcc/43260
    gdb_test "print *jprint.props" " = .*" "print a java.util.Properties"

    set test "print a java.lang.String"
    gdb_test_multiple "print jprint.hi" $test {
	-re " = java.lang.String \"hi maude\"\r\n$gdb_prompt $" {
	    pass $test
	}
	-re "There is no member named data\\.\r\n$gdb_prompt $" {
	    # GCJ system debug info for java.lang.String is not installed.
	    xfail $test
	}
    }
}
