# Copyright (C) 1998 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 is part of the gdb testsuite
# file written by Elena Zannoni (ezannoni@cygnus.com)
#
# source files ctti-add.cc, ctti-add1.cc, ctti-add2.cc, ctti-add3.cc
#


if $tracelevel then {
        strace $tracelevel
}

if { [skip_hp_tests] } then { continue }

# Check to see if we have an executable to test.  If not, then either we
# haven't tried to compile one, or the compilation failed for some reason.
# In either case, just notify the user and skip the tests in this file.

set testfile "ctti-add"
set srcfile  ${testfile}.cc
set srcfile1 ${testfile}1.cc
set srcfile2 ${testfile}2.cc
set srcfile3 ${testfile}3.cc
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info ${binfile} "c++"] {
    return -1;
}

if { $gcc_compiled } then { continue }

#if  { [gdb_compile "${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3}" "${binfile}" executable {debug c++}] != "" } {
#     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
#}

set cmdline "$CXX ${srcdir}/${subdir}/${srcfile} ${srcdir}/${subdir}/${srcfile1} ${srcdir}/${subdir}/${srcfile2} ${srcdir}/${subdir}/${srcfile3} -g -o ${binfile}"

remote_exec build $cmdline

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}



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


send_gdb "n\n"
gdb_expect {
    -re "$decimal.*i = 2;.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }


send_gdb "n\n"
gdb_expect {
    -re "$decimal.*f = 4.5;.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }

send_gdb "n\n"
gdb_expect {
    -re "$decimal.*c = add\\(c, c\\);.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }

send_gdb "n\n"
gdb_expect {
    -re "$decimal.*i = add\\(i, i\\);.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }

send_gdb "n\n"
gdb_expect {
    -re "$decimal.*f = add\\(f, f\\);.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }

send_gdb "n\n"
gdb_expect {
    -re "$decimal.*add1\\(\\);.*$gdb_prompt $" {
        pass "next "
      }
    -re ".*$gdb_prompt $" { fail "next " }
    timeout           { fail "next " }
  }

send_gdb "print c\n"
gdb_expect {
    -re ".$decimal = -62.*\r\n$gdb_prompt $" {
        pass "print value of c"
      }
    -re ".*$gdb_prompt $" { fail "print value of c" }
    timeout           { fail "(timeout) print value of c" }
  }


send_gdb "print f\n"
gdb_expect {
    -re ".$decimal = 9\r\n$gdb_prompt $" {
        pass "print value of f"
      }
    -re ".*$gdb_prompt $" { fail "print value of f" }
    timeout           { fail "(timeout) print value of f" }
  }


send_gdb "print i\n"
gdb_expect {
    -re ".$decimal = 4\r\n$gdb_prompt $" {
        pass "print value of i"
      }
    -re ".*$gdb_prompt $" { fail "print value of i" }
    timeout           { fail "(timeout) print value of i" }
  }



send_gdb "print add<int>(2,2)\n"
gdb_expect {
    -re ".$decimal = 4\r\n$gdb_prompt $" {
        pass "print value of add<int>(2,2)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add<int>(2,2)" }
    timeout           { fail "(timeout) print value of add<int>(2,2)" }
  }

send_gdb "print add<float>(2.3,2.3)\n"
gdb_expect {
    -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" {
        pass "print value of add<float>(2.3,2.3)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add<float>(2.3,2.3)" }
    timeout           { fail "(timeout) print value of add<float>(2.3,2.3)" }
  }

send_gdb "print add<char>('A','A')\n"
gdb_expect {
    -re ".$decimal = -126.*202.\r\n$gdb_prompt $" {
        pass "print value of add<char>('A','A')"
      }
    -re ".*$gdb_prompt $" { fail "print value of add<char>('A','A')" }
    timeout           { fail "(timeout) print value of add<char>('A','A')" }
  }


send_gdb "print add2<int>(2,2)\n"
gdb_expect {
    -re ".$decimal = 4\r\n$gdb_prompt $" {
        pass "print value of add2<int>(2,2)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add2<int>(2,2)" }
    timeout           { fail "(timeout) print value of add2<int>(2,2)" }
  }

send_gdb "print add2<float>(2.3,2.3)\n"
gdb_expect {
    -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" {
        pass "print value of add2<float>(2.3,2.3)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add2<float>(2.3,2.3)" }
    timeout           { fail "(timeout) print value of add2<float>(2.3,2.3)" }
  }

send_gdb "print add2<char>('A','A')\n"
gdb_expect {
    -re ".$decimal = -126.*202.\r\n$gdb_prompt $" {
        pass "print value of add2<char>('A','A')"
      }
    -re ".*$gdb_prompt $" { fail "print value of add2<char>('A','A')" }
    timeout           { fail "(timeout) print value of add2<char>('A','A')" }
  }

send_gdb "print add3<int>(2,2)\n"
gdb_expect {
    -re ".$decimal = 4\r\n$gdb_prompt $" {
        pass "print value of add3<int>(2,2)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add3<int>(2,2)" }
    timeout           { fail "(timeout) print value of add3<int>(2,2)" }
  }

send_gdb "print add3<float>(2.3,2.3)\n"
gdb_expect {
    -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" {
        pass "print value of add3<float>(2.3,2.3)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add3<float>(2.3,2.3)" }
    timeout           { fail "(timeout) print value of add3<float>(2.3,2.3)" }
  }

send_gdb "print add3<char>('A','A')\n"
gdb_expect {
    -re ".$decimal = -126.*202.\r\n$gdb_prompt $" {
        pass "print value of add3<char>('A','A')"
      }
    -re ".*$gdb_prompt $" { fail "print value of add3<char>('A','A')" }
    timeout           { fail "(timeout) print value of add3<char>('A','A')" }
  }

send_gdb "print add4<int>(2,2)\n"
gdb_expect {
    -re ".$decimal = 4\r\n$gdb_prompt $" {
        pass "print value of add4<int>(2,2)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add4<int>(2,2)" }
    timeout           { fail "(timeout) print value of add4<int>(2,2)" }
  }

send_gdb "print add4<float>(2.3,2.3)\n"
gdb_expect {
    -re ".$decimal = 4\\.5\[0-9\]+\r\n$gdb_prompt $" {
        pass "print value of add4<float>(2.3,2.3)"
      }
    -re ".*$gdb_prompt $" { fail "print value of add4<float>(2.3,2.3)" }
    timeout           { fail "(timeout) print value of add4<float>(2.3,2.3)" }
  }

send_gdb "print add4<char>('A','A')\n"
gdb_expect {
    -re ".$decimal = -126.*202.\r\n$gdb_prompt $" {
        pass "print value of add4<char>('A','A')"
      }
    -re ".*$gdb_prompt $" { fail "print value of add4<char>('A','A')" }
    timeout           { fail "(timeout) print value of add4<char>('A','A')" }
  }


gdb_exit
return 0
