# Copyright 1998-2021 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 is part of the gdb testsuite
# file written by Elena Zannoni (ezannoni@cygnus.com)
# rewritten by Michael Chastain (mec.gnu@mindspring.com)
#
# source files cttiadd.cc, cttiadd1.cc, cttiadd2.cc, cttiadd3.cc

# Call to template instantiations.

if { [skip_cplus_tests] } { continue }

standard_testfile cttiadd.cc cttiadd1.cc cttiadd2.cc cttiadd3.cc

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

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2 $srcfile3 $srcfile4] {debug c++}]} {
    return -1
}

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

gdb_breakpoint [gdb_get_line_number "marker add1"]
gdb_continue_to_breakpoint "marker add1"

gdb_test "print c" "\\$\[0-9\]+ = 194 .*"
gdb_test "print f" "\\$\[0-9\]+ = 9"
gdb_test "print i" "\\$\[0-9\]+ = 4"

# TODO: this needs more work before actually deploying it.
# So bail out here.

if { [ test_compiler_info gcc-*] } then { continue }

gdb_test_multiple "print add<int>(2,2)" "print add<int>(2,2)" {
    -re "\\$\[0-9\]+ = 4\r\n$gdb_prompt $" {
	pass "print add<int>(2,2)"
    }
    -re "No symbol \"add<int>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add<int>(2,2)"
    }
}

# Note: 2.25 and 4.5 are exactly representable in IEEE-ish formats
gdb_test_multiple "print add<float>(2.25,2.25)" "print add<float>(2.25,2.25)" {
    -re "\\$\[0-9\]+ = 4\\.5\r\n$gdb_prompt $" {
	pass "print add<float>(2.25,2.25)"
    }
    -re "No symbol \"add<float>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add<float>(2.25,2.25)"
    }
}

gdb_test_multiple "print add<unsigned char>('A','A')" "print add<unsigned char>('A','A')" {
    -re "\\$\[0-9\]+ = 130 .*\r\n$gdb_prompt $" {
	pass "print add<unsigned char>('A','A')"
    }
    -re "No symbol \"add<unsigned char>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add<unsigned char>('A','A')"
    }
}

gdb_test_multiple "print add2<int>(2,2)" "print add2<int>(2,2)" {
    -re "\\$\[0-9\]+ = 4\r\n$gdb_prompt $" {
	pass "print add2<int>(2,2)"
    }
    -re "No symbol \"add2<int>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add2<int>(2,2)"
    }
}

gdb_test_multiple "print add2<float>(2.25,2.25)" "print add2<float>(2.25,2.25)" {
    -re "\\$\[0-9\]+ = 4\\.5\r\n$gdb_prompt $" {
	pass "print add2<float>(2.25,2.25)"
    }
    -re "No symbol \"add2<float>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add2<float>(2.25,2.25)"
    }
}

gdb_test_multiple "print add2<unsigned char>('A','A')" "print add2<unsigned char>('A','A')" {
    -re "\\$\[0-9]+ = 130 .*$gdb_prompt $" {
	pass "print add2<unsigned char>('A','A')"
    }
    -re "No symbol \"add2<unsigned char>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add2<unsigned char>('A','A')"
    }
}

gdb_test_multiple "print add3<int>(2,2)" "print add3<int>(2,2)" {
    -re "\\$\[0-9\]+ = 4\r\n$gdb_prompt $" {
	pass "print add3<int>(2,2)"
    }
    -re "No symbol \"add3<int>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add3<int>(2,2)"
    }
}

gdb_test_multiple "print add3<float>(2.25,2.25)" "print add3<float>(2.25,2.25)" {
    -re "\\$\[0-9\]+ = 4\\.5\r\n$gdb_prompt $" {
	pass "print add3<float>(2.25,2.25)"
    }
    -re "No symbol \"add3<float>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add3<float>(2.25,2.25)"
    }
}

gdb_test_multiple "print add3<unsigned char>('A','A')" "print add3<unsigned char>('A','A')" {
    -re "\\$\[0-9]+ = 130 .*$gdb_prompt $" {
	pass "print add3<unsigned char>('A','A')"
    }
    -re "No symbol \"add3<unsigned char>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add3<unsigned char>('A','A')"
    }
}

gdb_test_multiple "print add4<int>(2,2)" "print add4<int>(2,2)" {
    -re "\\$\[0-9\]+ = 4\r\n$gdb_prompt $" {
	pass "print add4<int>(2,2)"
    }
    -re "No symbol \"add4<int>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add4<int>(2,2)"
    }
}

gdb_test_multiple "print add4<float>(2.25,2.25)" "print add4<float>(2.25,2.25)" {
    -re "\\$\[0-9\]+ = 4\\.5\r\n$gdb_prompt $" {
	pass "print add4<float>(2.25,2.25)"
    }
    -re "No symbol \"add4<float>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add4<float>(2.25,2.25)"
    }
}

gdb_test_multiple "print add4<unsigned char>('A','A')" "print add4<unsigned char>('A','A')" {
    -re "\\$\[0-9]+ = 130 .*$gdb_prompt $" {
	pass "print add4<unsigned char>('A','A')"
    }
    -re "No symbol \"add4<unsigned char>\" in current context.\r\n$gdb_prompt $" {
	# TODO: kfail or xfail this
	fail "print add4<unsigned char>('A','A')"
    }
}
