mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
9704b8b4bc
It is not necessary to call get_compiler_info before calling test_compiler_info, and, after recent commits that removed setting up the gcc_compiled, true, and false globals from get_compiler_info, there is now no longer any need for any test script to call get_compiler_info directly. As a result every call to get_compiler_info outside of lib/gdb.exp is redundant, and this commit removes them all. There should be no change in what is tested after this commit.
199 lines
6.6 KiB
Plaintext
199 lines
6.6 KiB
Plaintext
# Copyright 2002-2022 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] } { return }
|
|
|
|
standard_testfile .cc casts03.cc
|
|
|
|
if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
|
|
return -1
|
|
}
|
|
|
|
if ![runto_main] then {
|
|
perror "couldn't run to breakpoint"
|
|
return
|
|
}
|
|
|
|
# Prevent symbol on address 0x0 being printed.
|
|
gdb_test_no_output "set print symbol off" \
|
|
"turn of symbol printing for the first time"
|
|
|
|
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"
|
|
|
|
# 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"
|
|
|
|
gdb_test "print (unsigned long long) &gd == gd_value" " = true"
|
|
gdb_test "print (unsigned long long) (LeftRight *) (Right *) &gd == gd_value" \
|
|
" = true"
|
|
gdb_test "print (unsigned long long) (LeftRight *) (Right *) r_value == gd_value" \
|
|
" = true"
|
|
|
|
if {[prepare_for_testing "failed to prepare" ${testfile}03 $srcfile2 \
|
|
{debug c++ additional_flags=-std=c++03}]} {
|
|
return -1
|
|
}
|
|
|
|
if ![runto_main] then {
|
|
perror "couldn't run to breakpoint"
|
|
return
|
|
}
|
|
|
|
# Prevent symbol on address 0x0 being printed.
|
|
gdb_test_no_output "set print symbol off" \
|
|
"turn of symbol printing for the second time"
|
|
|
|
gdb_breakpoint [gdb_get_line_number "casts.exp: 1" $srcfile2]
|
|
gdb_continue_to_breakpoint "end of casts03"
|
|
|
|
# Test that keyword shadowing works.
|
|
|
|
gdb_test "whatis decltype(5)" " = double"
|