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

if { [skip_cplus_tests] } { continue }

standard_testfile .cc

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

if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

#
# 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		"void"
set dm_type_void_star		"void*"

# Some other vagaries of GDB's type printing machinery.  The integer types
# may have unsigned before or after their length, and may have "int"
# appended.  The char* conversion operator may have name "char*" even if
# the type is "char *", because the name comes from the debug information
# and the type from GDB.  Function types may not see through typedefs.

set dm_type_short		"short"
set dm_type_long		"long"
set dm_type_unsigned_short	"unsigned short"
set dm_type_unsigned_long	"unsigned long"
set dm_operator_char_star	"char*"
set dm_operator_char_star_quoted	"char\\*"
set dm_type_typedef		0

proc probe_demangler { } {
    global gdb_prompt
    global dm_operator_comma
    global dm_operator_char_star
    global dm_operator_char_star_quoted
    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
    global dm_type_short
    global dm_type_unsigned_short
    global dm_type_long
    global dm_type_unsigned_long
    global dm_type_typedef

    gdb_test_multiple "print &foo::operator,(foo&)" \
	"detect dm_operator_comma" {
	    -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"
	    }
	}

    gdb_test_multiple "print &foo::operator char*($dm_type_void)" \
	"detect dm_operator_char_star" {
	    -re ".*foo::operator char \\*\\(void\\).*\r\n$gdb_prompt $" {
		# v2 demangler or GDB type printer
		set dm_operator_char_star "char *"
		set dm_operator_char_star_quoted "char \\*"
		pass "detect dm_operator_char_star"
	    }
	    -re ".*foo::operator char\\*\\(\\).*\r\n$gdb_prompt $" {
		# v3 demangler
		pass "detect dm_operator_char_star"
	    }
	}

    gdb_test_multiple "print &dm_type_char_star" \
	"detect dm_type_char_star" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_foo_ref" \
	"detect dm_type_foo_ref" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_int_star" \
	"detect dm_type_int_star" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_long_star" \
	"detect dm_type_long_star" {
	    -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 ".*dm_type_long_star\\(long int \\*\\).*\r\n$gdb_prompt $" {
		# GCC v3 and GDB's type printer
		set dm_type_long_star "long int *"
		pass "detect dm_type_long_star"
	    }
	}

    gdb_test_multiple "print &dm_type_unsigned_int" \
	"detect dm_type_unsigned_int" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_void" \
	"detect dm_type_void" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_void_star" \
	"detect dm_type_void_star" {
	    -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"
	    }
	}

    gdb_test_multiple "print &dm_type_short" \
	"detect dm_type_short" {
	    -re ".*dm_type_short\\(short\\).*\r\n$gdb_prompt $" {
		# v2 and v3 demanglers
		pass "detect dm_type_short"
	    }
	    -re ".*dm_type_short\\(short int\\).*\r\n$gdb_prompt $" {
		# GDB type printer
		set dm_type_short "short int"
		pass "detect dm_type_short"
	    }
	}

    gdb_test_multiple "print &dm_type_unsigned_short" \
	"detect dm_type_unsigned_short" {
	    -re ".*dm_type_unsigned_short\\(unsigned short\\).*\r\n$gdb_prompt $" {
		# v2 and v3 demanglers
		pass "detect dm_type_unsigned_short"
	    }
	    -re ".*dm_type_unsigned_short\\(short unsigned int\\).*\r\n$gdb_prompt $" {
		# GDB type printer
		set dm_type_unsigned_short "short unsigned int"
		pass "detect dm_type_unsigned_short"
	    }
	}

    gdb_test_multiple "print &dm_type_long" \
	"detect dm_type_long" {
	    -re ".*dm_type_long\\(long\\).*\r\n$gdb_prompt $" {
		# v2 and v3 demanglers
		pass "detect dm_type_long"
	    }
	    -re ".*dm_type_long\\(long int\\).*\r\n$gdb_prompt $" {
		# GDB type printer
		set dm_type_long "long int"
		pass "detect dm_type_long"
	    }
	}

    gdb_test_multiple "print &dm_type_unsigned_long" \
	"detect dm_type_unsigned_long" {
	    -re ".*dm_type_unsigned_long\\(unsigned long\\).*\r\n$gdb_prompt $" {
		# v2 and v3 demanglers
		pass "detect dm_type_unsigned_long"
	    }
	    -re ".*dm_type_unsigned_long\\(long unsigned int\\).*\r\n$gdb_prompt $" {
		# GDB type printer
		set dm_type_unsigned_long "long unsigned int"
		pass "detect dm_type_unsigned_long"
	    }
	}

    gdb_test_multiple "print &dm_type_typedef" \
	"detect dm_type_typedef" {
	    -re ".*dm_type_typedef\\(int\\).*\r\n$gdb_prompt $" {
		# v2 and v3 demanglers
		pass "detect dm_type_typedef"
	    }
	    -re ".*dm_type_typedef\\(myint\\).*\r\n$gdb_prompt $" {
		# GDB type printer
		set dm_type_typedef 1
		pass "detect dm_type_typedef"
	    }
	}
}

#
#  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

    regsub {\\\(void\\\)} $demangled {\(\)} demangled

    gdb_test "info function $name" \
	"File .*:\r\n(class|)${demangled}.*" \
	"info function for \"$name\""
}

#
#  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.

# Note: carlton/2003-01-16: If you modify this, make a corresponding
# modification to print_addr_2_kfail.

proc print_addr_2 { name good } {
    global gdb_prompt
    global hex

    set good_pattern [string_to_regexp $good]

    gdb_test "print &$name" \
	".* = .* $hex <$good_pattern>"
}

# NOTE: carlton/2003-01-16: hairyfunc5-6 fail on GCC 3.x (for at least
# x=1 and x=2.1).  So I'm modifying print_addr_2 to accept a failure
# condition.  FIXME: It would be nice if the failure condition were
# conditional on the compiler version, but I'm not sufficiently
# motivated.  I did hardwire in the versions of char * and int *,
# which will give some compiler-specificity to the failure.

proc print_addr_2_kfail { name good bad bugid } {
    global gdb_prompt
    global hex

    set good_pattern [string_to_regexp $good]
    set bad_pattern [string_to_regexp $bad]

    gdb_test_multiple "print &$name" "print &$name" {
	-re ".* = .* $hex <$good_pattern>\r\n$gdb_prompt $" {
	    pass "print &$name"
	}
	-re ".* = .* $hex <$bad_pattern>\r\n$gdb_prompt $" {
	    kfail $bugid "print &$name"
	}
    }
}

#
#  Simple interfaces to print_addr_2.
#

proc print_addr { name } {
    regsub {\(void\)} $name {()} expected
    if {[string first "::" $name] == -1} {
	# C function -- must be qutoed
	set name "'$name'"
    }
    print_addr_2 "$name" $expected
}

#
# 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_operator_char_star
    global dm_type_char_star
    global dm_operator_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_operator_char_star_quoted\(" \
				"char *foo::operator $dm_operator_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
    global dm_operator_char_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)>"
    gdb_test "print &foo::operator new\[\]" \
	" = .* $hex <foo::operator new\\\[\\\]\\(.*\\)(| static)>"    
    if { !$hp_aCC_compiler } {
	print_addr "foo::operator delete($dm_type_void_star)"
	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_operator_char_star\($dm_type_void)"
}

#
# Test overloaded functions (1 arg).
#

proc test_paddr_overloaded_functions {} {
    global dm_type_unsigned_int
    global dm_type_void
    global dm_type_short
    global dm_type_unsigned_short
    global dm_type_long
    global dm_type_unsigned_long

    print_addr "overload1arg($dm_type_void)"
    print_addr "overload1arg(char)"
    print_addr "overload1arg(signed char)"
    print_addr "overload1arg(unsigned char)"
    print_addr "overload1arg($dm_type_short)"
    print_addr "overload1arg($dm_type_unsigned_short)"
    print_addr "overload1arg(int)"
    print_addr "overload1arg($dm_type_unsigned_int)"
    print_addr "overload1arg($dm_type_long)"
    print_addr "overload1arg($dm_type_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
    global dm_type_typedef

    print_addr_2 "hairyfunc1" "hairyfunc1(int)"

    if {$dm_type_typedef == 0} {
	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_kfail "hairyfunc5" "hairyfunc5(int (*(*)($dm_type_char_star))(long))" "hairyfunc5(int (*)(long) (*)(char*))" "gdb/19"
	print_addr_2_kfail "hairyfunc6" "hairyfunc6(int (*(*)($dm_type_int_star))(long))" "hairyfunc6(int (*)(long) (*)(int*))" "gdb/19"
	print_addr_2_kfail "hairyfunc7" "hairyfunc7(int (*(*)(int (*)($dm_type_char_star)))(long))" "hairyfunc7(int (*)(long) (*)(int (*)(char*)))" "gdb/19"
    } else {
	print_addr_2 "hairyfunc2" "hairyfunc2(PFPc_i)"
	print_addr_2 "hairyfunc3" "hairyfunc3(PFPFPl_s_i)"
	print_addr_2 "hairyfunc4" "hairyfunc4(PFPFPc_s_i)"

	# gdb-gnats bug gdb/19:
	# "gdb v3 demangler fails on hairyfunc5 hairyfunc6 hairyfunc7"
	print_addr_2 "hairyfunc5" "hairyfunc5(PFPc_PFl_i)"
	print_addr_2 "hairyfunc6" "hairyfunc6(PFPi_PFl_i)"
	print_addr_2 "hairyfunc7" "hairyfunc7(PFPFPc_i_PFl_i)"
    }
}

proc do_tests {} {
    global binfile
    global dm_type_int_star

    clean_restart $binfile

    gdb_test_no_output "set width 0"

    runto_main

    gdb_test_no_output "set language c++"
    probe_demangler
    test_paddr_overloaded_functions
    test_paddr_operator_functions
    test_paddr_hairy_functions
    test_lookup_operator_functions

    # A regression test on errors involving operators
    gdb_test "list foo::operator $dm_type_int_star" \
	"Function \"foo::operator [string_to_regexp $dm_type_int_star]\" not defined\\."
}

do_tests
