# Copyright 2002-2004, 2007-2012 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

# Test casting, especially between class types or pointer-to-class
# types.

# This file is part of the gdb testsuite

#
# test running programs
#


if { [skip_cplus_tests] } { continue }

set testfile "casts"
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++}] != "" } {
     untested casts.exp
     return -1
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

gdb_test "break [gdb_get_line_number "casts.exp: 1"]" \
    "Breakpoint.*at.* file .*" \
    ""

gdb_test "continue" "Breakpoint .* at .*casts.cc.*" ""

# Casting a pointer to a base class to a pointer to a derived class
# should yield the entire derived class.  Until August 2002, GDB got
# the enclosing type on `(B *) a' wrong: while the value's static type
# was `B *', as it should be, the enclosing type (which is supposed to
# be the dynamic type) was `A *'.  It's senseless to have a static
# type derived from the dynamic type; it should be the other way
# 'round.  Dereferencing this oddly typed pointer yielded a value in
# which only the base class's members were initialized, since GDB uses
# the enclosing type to decide how many bytes to read.  Members from
# the derived class were garbage, from GDB's address space.
gdb_test "print * (B *) a" ".* = {<A> = {a = 42}, b = 1729}" \
    "cast base class pointer to derived class pointer"

# Check also that we get the same results from letting the compiler do
# the dereference.
gdb_test "print * b" ".* = {<A> = {a = 42}, b = 1729}" \
    "let compiler cast base class pointer to derived class pointer"

# Check upcasting (it is trivial but still). 
gdb_test "print * (A *) b" ".* = {a = 42}" \
    "cast derived class pointer to base class pointer"

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

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

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


# A few basic tests of "new" casts.

gdb_test "print const_cast<const B *> (b)" " = \\(const B \\*\\) $hex" \
    "basic test of const_cast"

gdb_test "print const_cast<void *> (0)" " = \\(void \\*\\) 0x0" \
    "const_cast of 0"

gdb_test "print static_cast<A *> (b)" " = \\(A \\*\\) $hex" \
    "basic test of static_cast"

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

gdb_test "print reinterpret_cast<A *> (b)" " = \\(A \\*\\) $hex" \
    "basic test of reinterpret_cast"

gdb_test "print reinterpret_cast<void> (b)" "Invalid reinterpret_cast" \
    "test invalid reinterpret_cast"

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

# Tests of dynamic_cast.

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

gdb_test "print dynamic_cast<void> (a)" \
    ".*must be a pointer or reference type" \
    "invalid dynamic_cast"

gdb_test "print dynamic_cast<void *> (0)" \
    " = \\(void \\*\\) 0x0" \
    "dynamic_cast of 0 to void*"

gdb_test "print dynamic_cast<Alpha *> (&derived)" \
    " = \\(Alpha \\*\\) $nonzero_hex" \
    "dynamic_cast simple upcast"

gdb_test "print dynamic_cast<Alpha *> (&doublyderived)" \
    " = \\(Alpha \\*\\) $nonzero_hex" \
    "dynamic_cast upcast to unique base"

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

gdb_test "print dynamic_cast<Derived *> (ad)" \
    " = \\(Derived \\*\\) $nonzero_hex" \
    "dynamic_cast simple downcast"

gdb_test "print dynamic_cast<VirtuallyDerived *> (add)" \
    " = \\(VirtuallyDerived \\*\\) $nonzero_hex" \
    "dynamic_cast simple downcast to intermediate class"

gdb_test "print dynamic_cast<VirtuallyDerived *> (ad)" \
    " = \\(VirtuallyDerived \\*\\) 0x0" \
    "dynamic_cast to non-existing base"

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

gdb_test "print dynamic_cast<DoublyDerived *> (add)" \
    " = \\(DoublyDerived \\*\\) $nonzero_hex" \
    "dynamic_cast unique downcast"

gdb_test "print dynamic_cast<Gamma *> (add)" \
    " = \\(Gamma \\*\\) $nonzero_hex" \
    "dynamic_cast to sibling"
