# Copyright 2002, 2003, 2004, 2007, 2008, 2009, 2010
# 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

if $tracelevel then {
        strace $tracelevel
        }

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