775e0f0481
GDB in default prints the symbol associated on an address, and tests assume that there is no symbol on address zero. However, on bare metal target, address may be mapped to zero and there may be a symbol. Then, some tests fail as below: print const_cast<void *> (0)^M $8 = (void *) 0x0 <_ftext>^M (gdb) FAIL: gdb.cp/casts.exp: const_cast of 0 p acp->c1^M $9 = (A *) 0x0 <_ftext>^M (gdb) FAIL: gdb.cp/class2.exp: p acp->c1 This patch is to set print symbol off in these tests, like what I did previously https://sourceware.org/ml/gdb-patches/2014-07/msg00257.html gdb/testsuite: 2014-08-15 Yao Qi <yao@codesourcery.com> * gdb.cp/casts.exp: Set print symbol off. * gdb.cp/class2.exp: Likewise. * gdb.cp/overload.exp: Likewise. * gdb.cp/templates.exp: Likewise.
178 lines
5.8 KiB
Text
178 lines
5.8 KiB
Text
# Copyright 2002-2014 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 }
|
|
|
|
standard_testfile .cc
|
|
|
|
if [get_compiler_info "c++"] {
|
|
return -1
|
|
}
|
|
|
|
if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
|
|
return -1
|
|
}
|
|
|
|
if ![runto_main] then {
|
|
perror "couldn't run to breakpoint"
|
|
continue
|
|
}
|
|
|
|
# Prevent symbol on address 0x0 being printed.
|
|
gdb_test_no_output "set print symbol off"
|
|
|
|
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"
|
|
|
|
# Test that keyword shadowing works.
|
|
|
|
gdb_test "whatis decltype(5)" " = double"
|
|
|
|
# Basic tests using typeof.
|
|
|
|
foreach opname {__typeof__ __typeof __decltype} {
|
|
gdb_test "print (${opname}(a)) (b)" " = \\(A \\*\\) $hex" \
|
|
"old-style cast using $opname"
|
|
|
|
gdb_test "print static_cast<${opname}(a)> (b)" " = \\(A \\*\\) $hex" \
|
|
"static_cast using $opname"
|
|
|
|
gdb_test "print reinterpret_cast<${opname}(a)> (b)" " = \\(A \\*\\) $hex" \
|
|
"reinterpret_cast using $opname"
|
|
}
|
|
|
|
gdb_test "whatis __decltype(*a)" "type = A \\&"
|
|
|
|
# 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}( <vtable for Derived.*>)?" \
|
|
"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}( <vtable for DoublyDerived.*>)?" \
|
|
"dynamic_cast unique downcast"
|
|
|
|
gdb_test "print dynamic_cast<Gamma *> (add)" \
|
|
" = \\(Gamma \\*\\) $nonzero_hex" \
|
|
"dynamic_cast to sibling"
|