1# Copyright 2002, 2003, 2004 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 2 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software 15# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 17# This file is part of the gdb testsuite 18 19# Test casting, especially between class types or pointer-to-class 20# types. 21 22# This file is part of the gdb testsuite 23 24if $tracelevel then { 25 strace $tracelevel 26 } 27 28# 29# test running programs 30# 31 32set prms_id 0 33set bug_id 0 34 35if { [skip_cplus_tests] } { continue } 36 37set testfile "casts" 38set srcfile ${testfile}.cc 39set binfile ${objdir}/${subdir}/${testfile} 40 41if [get_compiler_info ${binfile} "c++"] { 42 return -1; 43} 44 45if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } { 46 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 47} 48 49 50gdb_exit 51gdb_start 52gdb_reinitialize_dir $srcdir/$subdir 53gdb_load ${binfile} 54 55if ![runto_main] then { 56 perror "couldn't run to breakpoint" 57 continue 58} 59 60gdb_test "break [gdb_get_line_number "casts.exp: 1"]" \ 61 "Breakpoint.*at.* file .*" \ 62 "" 63 64gdb_test "continue" "Breakpoint .* at .*casts.cc.*" "" 65 66# Casting a pointer to a base class to a pointer to a derived class 67# should yield the entire derived class. Until August 2002, GDB got 68# the enclosing type on `(B *) a' wrong: while the value's static type 69# was `B *', as it should be, the enclosing type (which is supposed to 70# be the dynamic type) was `A *'. It's senseless to have a static 71# type derived from the dynamic type; it should be the other way 72# 'round. Dereferencing this oddly typed pointer yielded a value in 73# which only the base class's members were initialized, since GDB uses 74# the enclosing type to decide how many bytes to read. Members from 75# the derived class were garbage, from GDB's address space. 76gdb_test "print * (B *) a" ".* = {<A> = {a = 42}, b = 1729}" \ 77 "cast base class pointer to derived class pointer" 78 79# Check also that we get the same results from letting the compiler do 80# the dereference. 81gdb_test "print * b" ".* = {<A> = {a = 42}, b = 1729}" \ 82 "let compiler cast base class pointer to derived class pointer" 83