# 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

# Tests for overloaded member functions with rvalue reference parameters,
# based on gdb.cp/overload.exp.

if {[skip_cplus_tests]} { continue }

load_lib "cp-support.exp"

standard_testfile .cc

if {[prepare_for_testing $testfile.exp $testfile $srcfile \
    {debug c++ additional_flags="-std=gnu++11"}]} {
    return -1
}

# Set it up at a breakpoint so we can play with the variable values.

if {![runto 'marker1']} {
    untested "couldn't run to marker1"
    return -1
}

# Prevent symbol on address 0x0 being printed.
gdb_test_no_output "set print symbol off"
gdb_test "up" ".*main.*" "up from marker1"

# Print the monster class type.
cp_test_ptype_class "foo_rr_instance1" "" "class" "foo" \
    {
	{ method public "foo(void);" }
	{ method public "foo(foo_lval_ref);" }
	{ method public "foo(foo_rval_ref);" }
	{ method public "~foo();" }
	{ method public "int overload1arg(foo_lval_ref);" }
	{ method public "int overload1arg(foo_rval_ref);" }
	{ method public "int overloadConst(const foo &);" }
	{ method public "int overloadConst(const foo &&);" }
    }

gdb_test "print foo_rr_instance1.overload1arg(arg)" "1"

gdb_test "print foo_rr_instance1.overload1arg(static_cast<foo&&>(arg))" "2"

gdb_test "print foo_rr_instance1.overloadConst(arg)" "3"

# Test lvalue vs rvalue function overloads
gdb_test "print f (i)" "1" "lvalue reference overload"

gdb_test "print f (ci)" "2" "lvalue reference to const overload"

setup_kfail "c++/15372" "*-*-*"
gdb_test "print f (3)" "3" "rvalue reference overload"

gdb_test "print g (i)" \
    "Cannot resolve function g to any overloaded instance" \
    "passing lvalue arg to rvalue parameter"
