summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.python/lib-types.exp
blob: 09c069d49f2889eb072a2a6d575bce5b9d489ec2 (plain)
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'\]}