# Copyright 1998, 1999, 2001 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 cttiadd.cc, cttiadd1.cc, cttiadd2.cc, cttiadd3.cc
#


if $tracelevel then {
        strace $tracelevel
}

if { [skip_cplus_tests] } { 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 "cttiadd"
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_FOR_TARGET ${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
