# Copyright 1992, 1997, 1999, 2001, 2002 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 Fred Fish. (fnf@cygnus.com)
# Adapted for g++ 3.0 ABI by Michael Chastain. (chastain@redhat.com)

if $tracelevel then {
	strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

set testfile "cplusfuncs"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

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

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

#
# g++ changed its ABI between 2.95 and 3.0.  gdb has two demanglers
# for the two different styles.  The two demanglers have some subtle
# discrepancies in their output.
#
#   old demangler         new demangler
#   --- ---------         --- ---------
#   "operator, "          "operator,"
#   "char *"              "char*"
#   "int *"               "int*"
#   "long *"              "long*"
#   "void *"              "void*"
#   "foo &"               "foo&"
#   "unsigned int"        "unsigned"
#   "void"                ""
#
# I probe for the forms in use.
# The defaults are for the v3 demangler (as of 2001-02-13).
#

set dm_operator_comma		","
set dm_type_char_star		"char*"
set dm_type_char_star_quoted    "char\\*"
set dm_type_foo_ref 		"foo&"
set dm_type_int_star		"int*"
set dm_type_long_star		"long*"
set dm_type_unsigned_int	"unsigned"
set dm_type_void		""
set dm_type_void_star		"void*"

proc probe_demangler { } {
    global gdb_prompt
    global dm_operator_comma
    global dm_type_char_star
    global dm_type_char_star_quoted
    global dm_type_foo_ref
    global dm_type_int_star
    global dm_type_long_star
    global dm_type_unsigned_int
    global dm_type_void
    global dm_type_void_star

    send_gdb "print &'foo::operator,(foo&)'\n"
    gdb_expect {
	-re ".*foo::operator, \\(.*foo.*&.*\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_operator_comma ", "
	    pass "detect dm_operator_comma"
	}
	-re ".*foo::operator,\\(.*foo.*&.*\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_operator_comma"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_operator_comma"
	}
	timeout {
	    fail "detect dm_operator_comma"
	}
    }

    send_gdb "print &'dm_type_char_star'\n"
    gdb_expect {
	-re ".*dm_type_char_star\\(char \\*\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_char_star "char *"
	    set dm_type_char_star_quoted "char \\*"
	    pass "detect dm_type_char_star"
	}
	-re ".*dm_type_char_star\\(char\\*\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_char_star"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_char_star"
	}
	timeout {
	    fail "detect dm_type_char_star (timeout)"
	}
    }

    send_gdb "print &'dm_type_foo_ref'\n"
    gdb_expect {
	-re ".*dm_type_foo_ref\\(foo &\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_foo_ref "foo &"
	    pass "detect dm_type_foo_ref"
	}
	-re ".*dm_type_foo_ref\\(foo&\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_foo_ref"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_foo_ref"
	}
	timeout {
	    fail "detect dm_type_foo_ref (timeout)"
	}
    }

    send_gdb "print &'dm_type_int_star'\n"
    gdb_expect {
	-re ".*dm_type_int_star\\(int \\*\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_int_star "int *"
	    pass "detect dm_type_int_star"
	}
	-re ".*dm_type_int_star\\(int\\*\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_int_star"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_int_star"
	}
	timeout {
	    fail "detect dm_type_int_star (timeout)"
	}
    }

    send_gdb "print &'dm_type_long_star'\n"
    gdb_expect {
	-re ".*dm_type_long_star\\(long \\*\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_long_star "long *"
	    pass "detect dm_type_long_star"
	}
	-re ".*dm_type_long_star\\(long\\*\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_long_star"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_long_star"
	}
	timeout {
	    fail "detect dm_type_long_star (timeout)"
	}
    }

    send_gdb "print &'dm_type_unsigned_int'\n"
    gdb_expect {
	-re ".*dm_type_unsigned_int\\(unsigned int\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_unsigned_int "unsigned int"
	    pass "detect dm_type_unsigned_int"
	}
	-re ".*dm_type_unsigned_int\\(unsigned\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_unsigned_int"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_unsigned_int"
	}
	timeout {
	    fail "detect dm_unsigned int (timeout)"
	}
    }

    send_gdb "print &'dm_type_void'\n"
    gdb_expect {
	-re ".*dm_type_void\\(void\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_void "void"
	    pass "detect dm_type_void"
	}
	-re ".*dm_type_void\\(\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_void"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_void"
	}
	timeout {
	    fail "detect dm_type_void (timeout)"
	}
    }

    send_gdb "print &'dm_type_void_star'\n"
    gdb_expect {
	-re ".*dm_type_void_star\\(void \\*\\).*\r\n$gdb_prompt $" {
	    # v2 demangler
	    set dm_type_void_star "void *"
	    pass "detect dm_type_void_star"
	}
	-re ".*dm_type_void_star\\(void\\*\\).*\r\n$gdb_prompt $" {
	    # v3 demangler
	    pass "detect dm_type_void_star"
	}
	-re ".*$gdb_prompt $" {
	    fail "detect dm_type_void_star"
	}
	timeout {
	    fail "detect dm_type_void_star (timeout)"
	}
    }
}

#
#  Lookup a specific C++ function and print the demangled type.
#  This form accepts the demangled type as a regexp.
#

proc info_func_regexp { name demangled } {
    global gdb_prompt

    send_gdb "info function $name\n"
    gdb_expect {
	-re ".*File .*:\r\n(class |)$demangled\r\n.*$gdb_prompt $" {
	    pass "info function for \"$name\""
	}
	-re ".*$gdb_prompt $" {
	    fail "info function for \"$name\""
	}
	timeout {
	    fail "info function for \"$name\" (timeout)"
	}
    }
}

#
#  Lookup a specific C++ function and print the demangled type.
#  This form accepts the demangled type as a literal string.
#

proc info_func { name demangled } {
    info_func_regexp "$name" [string_to_regexp "$demangled"]
}

#
# Print the address of a function.
# This checks that I can lookup a fully qualified C++ function.
# This also checks the argument types on the return string.
#

proc print_addr_2 { name good } {
    global gdb_prompt
    global hex

    set good_pattern [string_to_regexp $good]

    send_gdb "print &'$name'\n"
    gdb_expect {
	-re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" {
	    pass "print &'$name'"
	}
	-re ".*$gdb_prompt $" {
	    fail "print &'$name'"
	}
	timeout {
	    fail "print &'$name' (timeout)"
	}
    }
}

#
#  Simple interfaces to print_addr_2.
#

proc print_addr { name } {
    print_addr_2 "$name" "$name"
}

#
# Test name demangling for operators.
#
# The '(' at the end of each regex input pattern is so that we match only
# the one we are looking for.  I.E. "operator&" would match both
# "operator&(foo &)" and "operator&&(foo &)".
#
# gdb-gnats bug gdb/18:
#  "gdb can't parse "info func operator*" or "info func operator\*".
#  The star in "operator*" is interpreted as a regexp, but the "\*"
#  in  "operator\*" is not a legal operator.
#

proc test_lookup_operator_functions {} {
    global dm_operator_comma
    global dm_type_char_star
    global dm_type_char_star_quoted
    global dm_type_foo_ref
    global dm_type_void
    global dm_type_void_star

    # operator* requires quoting so that GDB does not treat it as a regexp.
    info_func "operator\\*("	"void foo::operator*($dm_type_foo_ref);"
    info_func "operator%("	"void foo::operator%($dm_type_foo_ref);"
    info_func "operator-("	"void foo::operator-($dm_type_foo_ref);"
    info_func "operator>>("	"void foo::operator>>($dm_type_foo_ref);"
    info_func "operator!=("	"void foo::operator!=($dm_type_foo_ref);"
    info_func "operator>("	"void foo::operator>($dm_type_foo_ref);"
    info_func "operator>=("	"void foo::operator>=($dm_type_foo_ref);"
    info_func "operator|("	"void foo::operator|($dm_type_foo_ref);"
    info_func "operator&&("	"void foo::operator&&($dm_type_foo_ref);"
    info_func "operator!("	"void foo::operator!($dm_type_void);"
    info_func "operator++("	"void foo::operator++(int);"
    info_func "operator=("	"void foo::operator=($dm_type_foo_ref);"
    info_func "operator+=("	"void foo::operator+=($dm_type_foo_ref);"
    # operator*= requires quoting so that GDB does not treat it as a regexp.
    info_func "operator\\*=("	"void foo::operator*=($dm_type_foo_ref);"
    info_func "operator%=("	"void foo::operator%=($dm_type_foo_ref);"
    info_func "operator>>=("	"void foo::operator>>=($dm_type_foo_ref);"
    info_func "operator|=("	"void foo::operator|=($dm_type_foo_ref);"
    info_func "operator$dm_operator_comma\("	\
    				"void foo::operator$dm_operator_comma\($dm_type_foo_ref);"
    info_func "operator/("	"void foo::operator/($dm_type_foo_ref);"
    info_func "operator+("	"void foo::operator+($dm_type_foo_ref);"
    info_func "operator<<("	"void foo::operator<<($dm_type_foo_ref);"
    info_func "operator==("	"void foo::operator==($dm_type_foo_ref);"
    info_func "operator<("	"void foo::operator<($dm_type_foo_ref);"
    info_func "operator<=("	"void foo::operator<=($dm_type_foo_ref);"
    info_func "operator&("	"void foo::operator&($dm_type_foo_ref);"
    info_func "operator^("	"void foo::operator^($dm_type_foo_ref);"
    info_func "operator||("	"void foo::operator||($dm_type_foo_ref);"
    info_func "operator~("	"void foo::operator~($dm_type_void);"
    info_func "operator--("	"void foo::operator--(int);"
    info_func "operator->("	"foo *foo::operator->($dm_type_void);"
    info_func "operator-=("	"void foo::operator-=($dm_type_foo_ref);"
    info_func "operator/=("	"void foo::operator/=($dm_type_foo_ref);"
    info_func "operator<<=("	"void foo::operator<<=($dm_type_foo_ref);"
    info_func "operator&=("	"void foo::operator&=($dm_type_foo_ref);"
    info_func "operator^=("	"void foo::operator^=($dm_type_foo_ref);"
    # operator->* requires quoting so that GDB does not treat it as a regexp.
    info_func "operator->\\*("	"void foo::operator->*($dm_type_foo_ref);"

    # operator[] needs double backslashes, so that a single backslash
    # will be sent to GDB, preventing the square brackets from being
    # evaluated as a regular expression. 
    info_func "operator\\\[\\\](" "void foo::operator\[\]($dm_type_foo_ref);"

    # These are gnarly because they might end with 'static'.
    set dm_type_void_star_regexp [string_to_regexp $dm_type_void_star]
    info_func_regexp "operator new("     "void \\*foo::operator new\\(.*\\)(| static);"
    info_func_regexp "operator delete("  "void foo::operator delete\\($dm_type_void_star_regexp\\)(| static);"

    info_func "operator int("	"int foo::operator int($dm_type_void);"
    info_func "operator()("	"void foo::operator()($dm_type_foo_ref);"
    info_func "operator $dm_type_char_star_quoted\(" \
				"char *foo::operator $dm_type_char_star\($dm_type_void);"

}


proc test_paddr_operator_functions {} {
    global hex
    global hp_aCC_compiler
    global dm_operator_comma
    global dm_type_char_star
    global dm_type_foo_ref
    global dm_type_long_star
    global dm_type_unsigned_int
    global dm_type_void
    global dm_type_void_star

    print_addr "foo::operator*($dm_type_foo_ref)"
    print_addr "foo::operator%($dm_type_foo_ref)"
    print_addr "foo::operator-($dm_type_foo_ref)"
    print_addr "foo::operator>>($dm_type_foo_ref)"
    print_addr "foo::operator!=($dm_type_foo_ref)"
    print_addr "foo::operator>($dm_type_foo_ref)"
    print_addr "foo::operator>=($dm_type_foo_ref)"
    print_addr "foo::operator|($dm_type_foo_ref)"
    print_addr "foo::operator&&($dm_type_foo_ref)"
    print_addr "foo::operator!($dm_type_void)"
    print_addr "foo::operator++(int)"
    print_addr "foo::operator=($dm_type_foo_ref)"
    print_addr "foo::operator+=($dm_type_foo_ref)"
    print_addr "foo::operator*=($dm_type_foo_ref)"
    print_addr "foo::operator%=($dm_type_foo_ref)"
    print_addr "foo::operator>>=($dm_type_foo_ref)"
    print_addr "foo::operator|=($dm_type_foo_ref)"
    print_addr "foo::operator$dm_operator_comma\($dm_type_foo_ref)"
    print_addr "foo::operator/($dm_type_foo_ref)"
    print_addr "foo::operator+($dm_type_foo_ref)"
    print_addr "foo::operator<<($dm_type_foo_ref)"
    print_addr "foo::operator==($dm_type_foo_ref)"
    print_addr "foo::operator<($dm_type_foo_ref)"
    print_addr "foo::operator<=($dm_type_foo_ref)"
    print_addr "foo::operator&($dm_type_foo_ref)"
    print_addr "foo::operator^($dm_type_foo_ref)"
    print_addr "foo::operator||($dm_type_foo_ref)"
    print_addr "foo::operator~($dm_type_void)"
    print_addr "foo::operator--(int)"
    print_addr "foo::operator->($dm_type_void)"
    print_addr "foo::operator-=($dm_type_foo_ref)"
    print_addr "foo::operator/=($dm_type_foo_ref)"
    print_addr "foo::operator<<=($dm_type_foo_ref)"
    print_addr "foo::operator&=($dm_type_foo_ref)"
    print_addr "foo::operator^=($dm_type_foo_ref)"
    print_addr "foo::operator->*($dm_type_foo_ref)"
    print_addr "foo::operator\[\]($dm_type_foo_ref)"
    print_addr "foo::operator()($dm_type_foo_ref)"

    gdb_test "print &'foo::operator new'" \
	" = .* $hex <foo::operator new\\(.*\\)(| static)>"
    if { !$hp_aCC_compiler } {
	print_addr "foo::operator delete($dm_type_void_star)"
    } else {
	gdb_test "print &'foo::operator delete($dm_type_void_star) static'" \
	    " = .*(0x\[0-9a-f\]+|) <foo::operator delete.*>"
    }

    print_addr "foo::operator int($dm_type_void)"
    print_addr "foo::operator $dm_type_char_star\($dm_type_void)"
}

#
# Test overloaded functions (1 arg).
#

proc test_paddr_overloaded_functions {} {
    global dm_type_unsigned_int
    global dm_type_void

    print_addr "overload1arg($dm_type_void)"
    print_addr "overload1arg(char)"
    print_addr "overload1arg(signed char)"
    print_addr "overload1arg(unsigned char)"
    print_addr "overload1arg(short)"
    print_addr "overload1arg(unsigned short)"
    print_addr "overload1arg(int)"
    print_addr "overload1arg($dm_type_unsigned_int)"
    print_addr "overload1arg(long)"
    print_addr "overload1arg(unsigned long)"
    print_addr "overload1arg(float)"
    print_addr "overload1arg(double)"

    print_addr "overloadargs(int)"
    print_addr "overloadargs(int, int)"
    print_addr "overloadargs(int, int, int)"
    print_addr "overloadargs(int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int)"
    print_addr "overloadargs(int, int, int, int, int, int, int, int, int, int, int)"
}

proc test_paddr_hairy_functions {} {
    global gdb_prompt
    global hex
    global dm_type_char_star
    global dm_type_int_star
    global dm_type_long_star

    print_addr_2 "hairyfunc1" "hairyfunc1(int)"
    print_addr_2 "hairyfunc2" "hairyfunc2(int (*)($dm_type_char_star))"
    print_addr_2 "hairyfunc3" "hairyfunc3(int (*)(short (*)($dm_type_long_star)))"
    print_addr_2 "hairyfunc4" "hairyfunc4(int (*)(short (*)($dm_type_char_star)))"

    # gdb-gnats bug gdb/19:
    # "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7"
    print_addr_2 "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))"
    print_addr_2 "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))"
    print_addr_2 "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))"
}

proc do_tests {} {
    global prms_id
    global bug_id
    global subdir
    global objdir
    global srcdir
    global binfile
    global gdb_prompt

    set prms_id 0
    set bug_id 0

    # Start with a fresh gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile

    send_gdb "set language c++\n"
    gdb_expect -re "$gdb_prompt $"
    send_gdb "set width 0\n"
    gdb_expect -re "$gdb_prompt $"

    # Get the debug format for the compiled test case.  If that
    # format is DWARF 1 then just skip all the tests since none of
    # them will pass.

    if [ runto_main] then {
	get_debug_format
	if [ setup_xfail_format "DWARF 1" ] then {
	    fail "C++ tests skipped due to limited C++ support in DWARF 1 debug format"
	    return
	}
	clear_xfail "*-*-*"
    }

    probe_demangler
    test_paddr_overloaded_functions
    test_paddr_operator_functions
    test_paddr_hairy_functions
    test_lookup_operator_functions
}

do_tests
