1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
# Copyright (C) 2010-2015 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.
# It tests the types.py module.
load_lib gdb-python.exp
standard_testfile .cc
if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
return -1
}
# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }
if ![runto_main] then {
fail "Can't run to main"
return 0
}
gdb_test_no_output "python import gdb.types"
# test get_basic_type const stripping
gdb_test_no_output "python const_class1_obj = gdb.parse_and_eval ('const_class1_obj')"
gdb_test_no_output "python basic_type_const_class1_obj = gdb.types.get_basic_type (const_class1_obj.type)"
gdb_test "python print (str (const_class1_obj.type))" "const class1"
set test "const stripping"
gdb_test_multiple "python print (str (basic_type_const_class1_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test get_basic_type volatile stripping
gdb_test_no_output "python volatile_class1_obj = gdb.parse_and_eval ('volatile_class1_obj')"
gdb_test_no_output "python basic_type_volatile_class1_obj = gdb.types.get_basic_type (volatile_class1_obj.type)"
gdb_test "python print (str (volatile_class1_obj.type))" "volatile class1"
set test "volatile stripping"
gdb_test_multiple "python print (str (basic_type_volatile_class1_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test get_basic_type volatile+const stripping
gdb_test_no_output "python const_volatile_class1_obj = gdb.parse_and_eval ('const_volatile_class1_obj')"
gdb_test_no_output "python basic_type_const_volatile_class1_obj = gdb.types.get_basic_type (const_volatile_class1_obj.type)"
gdb_test "python print (str (const_volatile_class1_obj.type))" "const volatile class1"
set test "volatile+const stripping"
gdb_test_multiple "python print (str (basic_type_const_volatile_class1_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test get_basic_type typedef stripping
gdb_test_no_output "python typedef_class1_obj = gdb.parse_and_eval ('typedef_class1_obj')"
gdb_test_no_output "python basic_type_typedef_class1_obj = gdb.types.get_basic_type (typedef_class1_obj.type)"
gdb_test "python print (str (typedef_class1_obj.type))" "typedef_class1"
set test "typedef stripping"
gdb_test_multiple "python print (str (basic_type_typedef_class1_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test get_basic_type reference stripping
gdb_test_no_output "python class1_ref_obj = gdb.parse_and_eval ('class1_ref_obj')"
gdb_test_no_output "python basic_type_class1_ref_obj = gdb.types.get_basic_type (class1_ref_obj.type)"
gdb_test "python print (str (class1_ref_obj.type))" "class1 &"
set test "reference stripping"
gdb_test_multiple "python print (str (basic_type_class1_ref_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test nested typedef stripping
gdb_test_no_output "python typedef_const_typedef_class1_obj = gdb.parse_and_eval ('typedef_const_typedef_class1_obj')"
gdb_test_no_output "python basic_type_typedef_const_typedef_class1_obj = gdb.types.get_basic_type (typedef_const_typedef_class1_obj.type)"
gdb_test "python print (str (typedef_class1_obj.type))" "typedef_class1"
set test "nested typedef stripping"
gdb_test_multiple "python print (str (basic_type_typedef_const_typedef_class1_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test nested typedef/reference stripping
gdb_test_no_output "python typedef_const_typedef_class1_ref_obj = gdb.parse_and_eval ('typedef_const_typedef_class1_ref_obj')"
gdb_test_no_output "python basic_type_typedef_const_typedef_class1_ref_obj = gdb.types.get_basic_type (typedef_const_typedef_class1_ref_obj.type)"
if {[test_compiler_info {gcc-*-*}]} { setup_xfail gcc/55641 *-*-* }
gdb_test "python print (str (typedef_const_typedef_class1_ref_obj.type))" "\[\r\n\]+typedef_const_typedef_class1_ref"
set test "nested typedef/ref stripping"
gdb_test_multiple "python print (str (basic_type_typedef_const_typedef_class1_ref_obj))" $test {
-re "\[\r\n\]+class1\[\r\n\]+$gdb_prompt $" {
pass $test
}
}
# test has_field on simple class
gdb_test_no_output "python class1_obj = gdb.parse_and_eval ('class1_obj')"
gdb_test "python print (gdb.types.has_field (class1_obj.type, 'x'))" "True"
gdb_test "python print (gdb.types.has_field (class1_obj.type, 'nope'))" "False"
# test has_field in base class
gdb_test_no_output "python subclass1_obj = gdb.parse_and_eval ('subclass1_obj')"
gdb_test "python print (gdb.types.has_field (subclass1_obj.type, 'x'))" "True"
# test make_enum_dict
gdb_test_no_output "python enum1_obj = gdb.parse_and_eval ('enum1_obj')"
gdb_test_no_output "python enum1_dict = gdb.types.make_enum_dict (enum1_obj.type)"
gdb_test_no_output "python enum1_list = sorted (enum1_dict.items ())"
gdb_test "python print (enum1_list)" {\[\('A', 0L?\), \('B', 1L?\), \('C', 2L?\)\]}
# test deep_items
gdb_test_no_output "python struct_a = gdb.lookup_type ('struct A')"
gdb_test "python print (struct_a.keys ())" {\['a', '', 'c', ''\]}
gdb_test "python print (\[k for k,v in gdb.types.deep_items(struct_a)\])" {\['a', 'b0', 'b1', 'bb0', 'bb1', 'bbb0', 'bbb1', 'c', 'dd0', 'dd1', 'd2', 'd3'\]}
|