# Copyright 1998-2017 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);" }
    }

gdb_test "print foo_rr_instance1.overload1arg(arg)" \
    "\\$\[0-9\]+ = 1" \
    "print call overloaded func foo & arg"

gdb_test "print foo_rr_instance1.overload1arg(static_cast<foo&&>(arg))" \
    "\\$\[0-9\]+ = 2" \
    "print call overloaded func foo && arg"

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