# Copyright 1997, 1998, 1999, 2000, 2007, 2008, 2009
# 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 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
}

set additional_flags {debug}

if {$hp_cc_compiler} {
    lappend additional_flags "additional_flags=-Ae"
}

# build the first test case
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	   executable ${additional_flags}] != "" } {
     untested varargs.exp
     return -1
}

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

