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

# C++11 rvalue reference type casting tests, based on gdb.cp/casts.exp.

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++ additional_flags="-std=gnu++11"}]} {
    return -1
}

if {![runto_main]} {
    return -1
}

# Prevent symbol on address 0x0 being printed.
gdb_test_no_output "set print symbol off"

set line [gdb_get_line_number {rvalue-ref-casts.exp: 1}]
gdb_test "break $line" "Breakpoint.*at.* file .*$srcfile, line $line\\." \
    "break at test location"

gdb_test "continue" "Breakpoint .* at .*$srcfile:$line.*"

# Check upcasting.
gdb_test "print (A &&) br" ".* = .A &&.* {a = 42}" \
    "cast derived class rvalue reference to base class rvalue reference"

# Check downcasting.
gdb_test "print (B &&) ar" ".* = .B.* {<A> = {a = 42}, b = 1729}" \
    "cast base class rvalue reference to derived class rvalue reference"

# Check compiler casting

set nonzero_hex "0x\[0-9A-Fa-f\]\[0-9A-Fa-f\]+"

gdb_test "print br" ".* = .B.* {<A> = {a = 42}, b = 1729}" \
    "let compiler cast base class rvalue reference to derived\
    class rvalue reference"

gdb_test "print static_cast<A &&> (*b)" " = \\(A \\&\\&\\) @$hex: {a = 42}" \
    "static_cast to rvalue reference type"

gdb_test "print reinterpret_cast<A &&> (*b)" \
    " = \\(A \\&\\&\\) @$hex: {a = 42}" \
    "reinterpret_cast to rvalue reference type"

gdb_test "print dynamic_cast<Alpha &&> (derived)" \
    " = \\(Alpha \\&\\&\\) @$nonzero_hex: {.* = ${nonzero_hex}(\
    <vtable for Derived.*>)?}" \
    "dynamic_cast simple upcast to rvalue reference"

gdb_test "print dynamic_cast<VirtuallyDerived &&> (*ad)" \
    "dynamic_cast failed" \
    "dynamic_cast to rvalue reference to non-existing base"
