# Copyright 1997, 1998, 1999, 2000 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.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# This file was written by Elena Zannoni (ezannoni@cygnus.com)


# this file tests command line calls with functions having variable
# args list
# corresponding source file: varargs.c

#print find_max1(5,1,2,3,4,5)
#print find_max1(1,3)
#call find_max1(10,1,2,3,4,5,6,7,8,29,0)
#print find_max2(3,1,2,3)
#print find_max_double(5,1.0,17.0,2.0,3.0,4.0)
#quit


if $tracelevel then {
        strace $tracelevel
}

set prms_id 0
set bug_id 0

set prototypes 0
set testfile "varargs"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

if {$hp_cc_compiler} {
    set additional_flags "additional_flags=-Ae"
} else {
    set additional_flags ""
}

# build the first test case
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug ${additional_flags}}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
send_gdb "set print sevenbit-strings\n" ; gdb_expect -re "$gdb_prompt $"
send_gdb "set print address off\n" ; gdb_expect -re "$gdb_prompt $"
send_gdb "set width 0\n" ; gdb_expect -re "$gdb_prompt $"

if [gdb_skip_stdio_test "varargs.exp"] {
    # Nothing in this module is testable without printf.
    return;
}

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

if { $hp_aCC_compiler } {
    # When compiled w/ aCC we need to disable overload resolution
    # for command line calls.
    # We need it for vararg calls since the aCC compiler gives us no
    # information about the undeclared arguments, or even that there 
    # _are_ undeclared arguments. As far as gdb is concerned it only
    # knows about the declared arguments. So we need to force the call
    # even though the overload resolution mechanism says that the types
    # don't match. 
    # - guo
    gdb_test "set overload-resolution 0" ""
}

send_gdb "print find_max1(5,1,2,3,4,5)\n"
gdb_expect {
    -re ".*find_max\\(5, 1, 2, 3, 4, 5\\) returns 5\[ \r\n\]+.\[0-9\]+ = 5.*$gdb_prompt $" {
        pass "print find_max1(5,1,2,3,4,5)"
      }
    -re ".*$gdb_prompt $" { fail "print find_max1(5,1,2,3,4,5)" }
    timeout           { fail "(timeout) print find_max1(5,1,2,3,4,5)" }
  }




send_gdb "print find_max1(1,3)\n"
gdb_expect {
    -re ".*find_max\\(1, 3\\) returns 3\[ \r\n\]+.\[0-9\]+ = 3.*$gdb_prompt $" {
        pass "print find_max1(1,3)"
      }
    -re ".*$gdb_prompt $" { fail "print find_max1(1,3)" }
    timeout           { fail "(timeout) print find_max1(1,3)" }
  }


send_gdb "print find_max1(10,1,2,3,4,5,6,7,8,29,0)\n"
gdb_expect {
    -re ".*find_max\\(10, 1, 2, 3, 4, 5, 6, 7, 8, 29, 0\\) returns 29\[ \r\n\]+.\[0-9\]+ = 29.*$gdb_prompt $" {
        pass "print find_max1(10,1,2,3,4,5,6,7,8,29,0)"
      }
    -re ".*$gdb_prompt $" { fail "print find_max1(10,1,2,3,4,5,6,7,8,29,0)" }
    timeout           { fail "(timeout) print find_max1(10,1,2,3,4,5,6,7,8,29,0)" }
  }



send_gdb "print find_max2(3,1,2,3)\n"
gdb_expect {
    -re ".*find_max\\(3, 1, 2, 3\\) returns 3\[ \r\n\]+.\[0-9\]+ = 3.*$gdb_prompt $" {
        pass "print find_max2(3,1,2,3)"
      }
    -re ".*$gdb_prompt $" { fail "print find_max2(3,1,2,3)" }
    timeout           { fail "(timeout) print find_max2(3,1,2,3)" }
  }


if {![target_info exists gdb,skip_float_tests]} {
  send_gdb "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)\n"
  gdb_expect {
    -re ".*find_max\\(.*\\) returns 17\\.000000\[ \r\n\]+.\[0-9\]+ = 17.*$gdb_prompt $" {
      pass "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)"
    }
    -re ".*$gdb_prompt $" { fail "print find_max_double(5,1.0,17.0,2.0,3.0,4.0)" }
    timeout           { fail "(timeout) print find_max_double(5,1.0,17.0,2.0,3.0,4.0)" }
  }
}

