#   Copyright (C) 1997-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/>.


set testfile langs
set binfile ${objdir}/${subdir}/${testfile}

if [is_remote host] {
    remote_download host ${srcdir}/${subdir}/langs1.f
    remote_download host ${srcdir}/${subdir}/langs2.cxx
}


if  { [gdb_compile "${srcdir}/${subdir}/langs0.c" "${binfile}0.o" object {debug}] != "" } {
     untested langs.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/langs1.c" "${binfile}1.o" object {debug}] != "" } {
     untested langs.exp
     return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/langs2.c" "${binfile}2.o" object {debug}] != "" } {
     untested langs.exp
     return -1
}

if  { [gdb_compile "${binfile}0.o ${binfile}1.o ${binfile}2.o" ${binfile} executable {debug}] != "" } {
     untested langs.exp
     return -1
}

set oldtimeout $timeout
set timeout 10



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

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

gdb_test_multiple "b langs0" "break on nonexistent function in langs.exp" {
	-re "Function \"langs0\" not defined\..*Make breakpoint pending on future shared library load.*y or .n.. $" {

		gdb_test "n" "" "break on nonexistent function in langs.exp"
	}
	-re "Breakpoint .* (deferred).*$gdb_prompt $" {
		pass "break on nonexistent function in langs.exp"
	}
}

if {$hp_aCC_compiler} {
    set isfixed 1
    set lang c\\+\\+
    set ext cxx
    set foo_func foo__Fi__Fi
    set do_func do::langs0
} else {
    if {$hp_cc_compiler} {
        set isfixed 1
        set lang c
        set ext c
    } else {
        set isfixed 0
    }
    set foo_func foo__Fi
    set do_func langs0__2do
}

if [runto csub] then {

    if { !$isfixed } { set lang c }
    gdb_test "show language" "currently $lang\".*" \
	"show language at csub in langs.exp"
    # On some machines, foo doesn't get demangled because the N_SOL for
    # langs2.cxx is seen only after the function stab for foo.  So
    # the following regexps are kludged to accept foo__Fi as well as foo,
    # even though only the latter is correct.  I haven't tried to xfail it
    # because it depends on details of the compiler.
    
    # Take out xfail. This test has been passing for some time now.
    #if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
    gdb_test "bt" "#0.*csub.*#1.*(foo|$foo_func) \\(.*#2.*cppsub_ .*#3.*fsub.*#4.*$do_func \\(.*#5  \[0-9a-fx\]* in main.*" "backtrace in langs.exp"

    if { !$isfixed } { set lang c\\+\\+; set ext cxx }
    if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" }
    gdb_test "up" ".* in (foo|$foo_func).* at langs2\\.$ext.*return csub \\(.*" \
	"up to foo in langs.exp"
    gdb_test "show language" "currently $lang.*" \
	"show language at foo in langs.exp"

    if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" }
    gdb_test "up" ".* in cppsub_ .* at langs2\\.$ext.*return foo \\(.*" \
	"up to cppsub_ in langs.exp"
    gdb_test "show language" "currently $lang.*" \
	"show language at cppsub_ in langs.exp"

    if { !$isfixed } { set lang fortran }
    if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" }
    gdb_test "up" ".* in fsub.* at langs1\\.f.*" \
	"up to fsub in langs.exp"
    gdb_test "show language" "currently $lang.*" \
	"show language at fsub in langs.exp"

    # Take out xfail. This test has been passing for sometime now.
    #if {!$gcc_compiled} then { setup_xfail "hppa*-*-hpux*" }
    if { !$isfixed } { set lang c }
    gdb_test "up" ".* in $do_func .* at .*langs0\\.c.*return fsub.*" \
	"up to langs0__2do in langs.exp"
    gdb_test "show language" "currently $lang\".*" \
	"show language at langs0__2do in langs.exp"

    gdb_test "up" ".* in main .* at .*langs0\\.c.*if \\(langs0__2do \\(.*" \
	"up to main in langs.exp"
    gdb_test "show language" "currently $lang\".*" \
	"show language at main in langs.exp"

    if [target_info exists gdb,noresults] { return }

    gdb_continue_to_end "langs.exp"
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load $binfile

# Try exercising the "minimal" language a bit...

if [runto csub] then {
    gdb_test "set lang minimal" \
             "Warning: the current language does not match this frame." \
             "set lang to minimal"
    
    gdb_test "print x" " = 5000" "print parameter value"
}

set timeout $oldtimeout
return 0
