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

# 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
	}
    }
}
