Skip to content

Commit 25baf35

Browse files
committed
test(STL): add shell tests for STL types with PDB and NativePDB
1 parent 66ab512 commit 25baf35

File tree

2 files changed

+385
-0
lines changed

2 files changed

+385
-0
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
# REQUIRES: target-windows
2+
3+
# Test that LLDB can format types from MSVC's STL
4+
# RUN: split-file %s %t
5+
# RUN: %build --compiler=clang-cl --std c++20 -o %t.exe -- %t/main.cpp
6+
# RUN: %lldb -f %t.exe -s \
7+
# RUN: %t/commands.input 2>&1 | FileCheck %s
8+
9+
#--- main.cpp
10+
11+
#include <bitset>
12+
#include <coroutine>
13+
#include <deque>
14+
#include <forward_list>
15+
#include <list>
16+
#include <map>
17+
#include <memory>
18+
#include <optional>
19+
#include <set>
20+
#include <string>
21+
#include <tuple>
22+
#include <unordered_map>
23+
#include <unordered_set>
24+
#include <variant>
25+
#include <vector>
26+
27+
int main() {
28+
std::shared_ptr<int> sp = std::make_shared<int>(41);
29+
std::weak_ptr<int> wp = sp;
30+
std::unique_ptr<int> unique(new int(42));
31+
std::optional<std::u16string> opt = u"abc";
32+
std::string str = "str";
33+
std::u8string u8str = u8"str";
34+
std::wstring wStr = L"wstr";
35+
std::tuple<int, bool, float> tuple{1, false, 4.2};
36+
std::coroutine_handle<> coroHandle;
37+
std::bitset<16> bitset(123);
38+
39+
std::map<int, int> map{{1, 2}, {2, 4}, {3, 6}};
40+
auto mapIt = map.find(3);
41+
std::set<int> set{1, 2, 3};
42+
std::multimap<int, int> mMap{{1, 2}, {1, 1}, {2, 4}};
43+
std::multiset<int> mSet{1, 2, 3};
44+
45+
std::variant<int, float, std::string, std::monostate> variant = "wow";
46+
std::list<int> list{1, 2, 3};
47+
std::forward_list<int> fwList{1, 2, 3};
48+
49+
std::unordered_map<int, int> uMap{{1, 2}, {2, 4}, {3, 6}};
50+
std::unordered_set<int> uSet{1, 2, 4};
51+
std::unordered_multimap<int, int> uMMap{{1, 2}, {1, 1}, {2, 4}};
52+
std::unordered_multiset<int> uMSet{1, 1, 2};
53+
std::deque<int> deque{1, 2, 3};
54+
std::vector<int> vec{1, 2, 3};
55+
return 0; // break here
56+
}
57+
58+
#--- commands.input
59+
60+
br s -p "break here"
61+
r
62+
63+
fr v sp
64+
fr v wp
65+
fr v unique
66+
# FIXME: _Has_value is put into the anonymous union along with _Value
67+
# fr v opt
68+
fr v str
69+
fr v u8str
70+
fr v wStr
71+
fr v tuple
72+
fr v map
73+
fr v mapIt
74+
fr v set
75+
fr v mMap
76+
fr v mSet
77+
fr v variant
78+
fr v list
79+
fr v fwList
80+
fr v uMap
81+
fr v uSet
82+
fr v uMMap
83+
fr v uMSet
84+
# FIXME: Static _Block_size is found but doesn't have a value
85+
# fr v deque
86+
fr v vec
87+
88+
quit
89+
90+
# CHECK: (lldb) fr v sp
91+
# CHECK-NEXT: (std::shared_ptr<int>) sp = 41 strong=1 weak=1 {
92+
# CHECK-NEXT: pointer = 0x{{.*}}
93+
# CHECK-NEXT: }
94+
# CHECK-NEXT: (lldb) fr v wp
95+
# CHECK-NEXT: (std::weak_ptr<int>) wp = 41 strong=1 weak=1 {
96+
# CHECK-NEXT: pointer = 0x{{.*}}
97+
# CHECK-NEXT: }
98+
# CHECK-NEXT: (lldb) fr v unique
99+
# CHECK-NEXT: (std::unique_ptr<int, std::default_delete<int>>) unique = 42 {
100+
# CHECK-NEXT: pointer = 0x{{.*}}
101+
# CHECK-NEXT: }
102+
# CHECK-NEXT: (lldb) fr v str
103+
# CHECK-NEXT: (std::basic_string<char, std::char_traits<char>, std::allocator<char>>) str = "str"
104+
# CHECK-NEXT: (lldb) fr v u8str
105+
# CHECK-NEXT: (std::basic_string<char8_t, std::char_traits<char8_t>, std::allocator<char8_t>>) u8str = u8"str"
106+
# CHECK-NEXT: (lldb) fr v wStr
107+
# CHECK-NEXT: (std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>) wStr = L"wstr"
108+
# CHECK-NEXT: (lldb) fr v tuple
109+
# CHECK-NEXT: (std::tuple<int, bool, float>) tuple = size=3 {
110+
# CHECK-NEXT: [0] = 1
111+
# CHECK-NEXT: [1] = false
112+
# CHECK-NEXT: [2] = 4.{{.*}}
113+
# CHECK-NEXT: }
114+
# CHECK-NEXT: (lldb) fr v map
115+
# CHECK-NEXT: (std::map<int, int, std::less<int>, std::allocator<std::pair<int const, int>>>) map = size=3 {
116+
# CHECK-NEXT: [0] = (first = 1, second = 2)
117+
# CHECK-NEXT: [1] = (first = 2, second = 4)
118+
# CHECK-NEXT: [2] = (first = 3, second = 6)
119+
# CHECK-NEXT: }
120+
# CHECK-NEXT: (lldb) fr v mapIt
121+
# CHECK-NEXT: (std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<int const, int>>>>) mapIt = {
122+
# CHECK-NEXT: first = 3
123+
# CHECK-NEXT: second = 6
124+
# CHECK-NEXT: }
125+
# CHECK-NEXT: (lldb) fr v set
126+
# CHECK-NEXT: (std::set<int, std::less<int>, std::allocator<int>>) set = size=3 {
127+
# CHECK-NEXT: [0] = 1
128+
# CHECK-NEXT: [1] = 2
129+
# CHECK-NEXT: [2] = 3
130+
# CHECK-NEXT: }
131+
# CHECK-NEXT: (lldb) fr v mMap
132+
# CHECK-NEXT: (std::multimap<int, int, std::less<int>, std::allocator<std::pair<int const, int>>>) mMap = size=3 {
133+
# CHECK-NEXT: [0] = (first = 1, second = 2)
134+
# CHECK-NEXT: [1] = (first = 1, second = 1)
135+
# CHECK-NEXT: [2] = (first = 2, second = 4)
136+
# CHECK-NEXT: }
137+
# CHECK-NEXT: (lldb) fr v mSet
138+
# CHECK-NEXT: (std::multiset<int, std::less<int>, std::allocator<int>>) mSet = size=3 {
139+
# CHECK-NEXT: [0] = 1
140+
# CHECK-NEXT: [1] = 2
141+
# CHECK-NEXT: [2] = 3
142+
# CHECK-NEXT: }
143+
# CHECK-NEXT: (lldb) fr v variant
144+
# CHECK-NEXT: (std::variant<int, float, std::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::monostate>) variant = Active Type = std::basic_string<char, std::char_traits<char>, std::allocator<char>> {
145+
# CHECK-NEXT: Value = "wow"
146+
# CHECK-NEXT: }
147+
# CHECK-NEXT: (lldb) fr v list
148+
# CHECK-NEXT: (std::list<int, std::allocator<int>>) list = size=3 {
149+
# CHECK-NEXT: [0] = 1
150+
# CHECK-NEXT: [1] = 2
151+
# CHECK-NEXT: [2] = 3
152+
# CHECK-NEXT: }
153+
# CHECK-NEXT: (lldb) fr v fwList
154+
# CHECK-NEXT: (std::forward_list<int, std::allocator<int>>) fwList = size=3 {
155+
# CHECK-NEXT: [0] = 1
156+
# CHECK-NEXT: [1] = 2
157+
# CHECK-NEXT: [2] = 3
158+
# CHECK-NEXT: }
159+
# CHECK-NEXT: (lldb) fr v uMap
160+
# CHECK-NEXT: (std::unordered_map<int, int, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<int const, int>>>) uMap = size=3 {
161+
# CHECK-NEXT: [0] = (first = 1, second = 2)
162+
# CHECK-NEXT: [1] = (first = 2, second = 4)
163+
# CHECK-NEXT: [2] = (first = 3, second = 6)
164+
# CHECK-NEXT: }
165+
# CHECK-NEXT: (lldb) fr v uSet
166+
# CHECK-NEXT: (std::unordered_set<int, std::hash<int>, std::equal_to<int>, std::allocator<int>>) uSet = size=3 {
167+
# CHECK-NEXT: [0] = 1
168+
# CHECK-NEXT: [1] = 2
169+
# CHECK-NEXT: [2] = 4
170+
# CHECK-NEXT: }
171+
# CHECK-NEXT: (lldb) fr v uMMap
172+
# CHECK-NEXT: (std::unordered_multimap<int, int, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<int const, int>>>) uMMap = size=3 {
173+
# CHECK-NEXT: [0] = (first = 1, second = 2)
174+
# CHECK-NEXT: [1] = (first = 1, second = 1)
175+
# CHECK-NEXT: [2] = (first = 2, second = 4)
176+
# CHECK-NEXT: }
177+
# CHECK-NEXT: (lldb) fr v uMSet
178+
# CHECK-NEXT: (std::unordered_multiset<int, std::hash<int>, std::equal_to<int>, std::allocator<int>>) uMSet = size=3 {
179+
# CHECK-NEXT: [0] = 1
180+
# CHECK-NEXT: [1] = 1
181+
# CHECK-NEXT: [2] = 2
182+
# CHECK-NEXT: }
183+
# CHECK-NEXT: (lldb) fr v vec
184+
# CHECK-NEXT: (std::vector<int, std::allocator<int>>) vec = size=3 {
185+
# CHECK-NEXT: [0] = 1
186+
# CHECK-NEXT: [1] = 2
187+
# CHECK-NEXT: [2] = 3
188+
# CHECK-NEXT: }
Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
# REQUIRES: target-windows
2+
3+
# Test that LLDB can format types from MSVC's STL
4+
# RUN: split-file %s %t
5+
# RUN: %build --compiler=clang-cl --std c++20 -o %t.exe -- %t/main.cpp
6+
# RUN: %lldb -f %t.exe -s \
7+
# RUN: %t/commands.input 2>&1 | FileCheck %s
8+
9+
#--- main.cpp
10+
11+
#include <bitset>
12+
#include <coroutine>
13+
#include <deque>
14+
#include <forward_list>
15+
#include <list>
16+
#include <map>
17+
#include <memory>
18+
#include <optional>
19+
#include <set>
20+
#include <string>
21+
#include <tuple>
22+
#include <unordered_map>
23+
#include <unordered_set>
24+
#include <variant>
25+
#include <vector>
26+
27+
int main() {
28+
std::shared_ptr<int> sp = std::make_shared<int>(41);
29+
std::weak_ptr<int> wp = sp;
30+
std::unique_ptr<int> unique(new int(42));
31+
std::optional<std::u16string> opt = u"abc";
32+
std::string str = "str";
33+
std::u8string u8str = u8"str";
34+
std::wstring wStr = L"wstr";
35+
std::tuple<int, bool, float> tuple{1, false, 4.2};
36+
std::coroutine_handle<> coroHandle;
37+
std::bitset<16> bitset(123);
38+
39+
std::map<int, int> map{{1, 2}, {2, 4}, {3, 6}};
40+
auto mapIt = map.find(3);
41+
std::set<int> set{1, 2, 3};
42+
std::multimap<int, int> mMap{{1, 2}, {1, 1}, {2, 4}};
43+
std::multiset<int> mSet{1, 2, 3};
44+
45+
std::variant<int, float, std::string, std::monostate> variant = "wow";
46+
std::list<int> list{1, 2, 3};
47+
std::forward_list<int> fwList{1, 2, 3};
48+
49+
std::unordered_map<int, int> uMap{{1, 2}, {2, 4}, {3, 6}};
50+
std::unordered_set<int> uSet{1, 2, 4};
51+
std::unordered_multimap<int, int> uMMap{{1, 2}, {1, 1}, {2, 4}};
52+
std::unordered_multiset<int> uMSet{1, 1, 2};
53+
std::deque<int> deque{1, 2, 3};
54+
std::vector<int> vec{1, 2, 3};
55+
return 0; // break here
56+
}
57+
58+
#--- commands.input
59+
60+
br s -p "break here"
61+
r
62+
63+
fr v sp
64+
fr v wp
65+
fr v unique
66+
fr v opt
67+
fr v str
68+
# FIXME: char8_t is not recognized as a type -
69+
# the string has a void pointer/void array for SSO storage.
70+
# fr v u8str
71+
fr v wStr
72+
fr v tuple
73+
fr v map
74+
fr v mapIt
75+
fr v set
76+
fr v mMap
77+
fr v mSet
78+
fr v variant
79+
fr v list
80+
fr v fwList
81+
fr v uMap
82+
fr v uSet
83+
fr v uMMap
84+
fr v uMSet
85+
# FIXME: Static _Block_size is found but doesn't have a value
86+
fr v deque
87+
fr v vec
88+
89+
quit
90+
91+
# CHECK: (lldb) fr v sp
92+
# CHECK-NEXT: (std::shared_ptr<int>) sp = 41 strong=1 weak=1 {
93+
# CHECK-NEXT: pointer = 0x{{.*}}
94+
# CHECK-NEXT: }
95+
# CHECK-NEXT: (lldb) fr v wp
96+
# CHECK-NEXT: (std::weak_ptr<int>) wp = 41 strong=1 weak=1 {
97+
# CHECK-NEXT: pointer = 0x{{.*}}
98+
# CHECK-NEXT: }
99+
# CHECK-NEXT: (lldb) fr v unique
100+
# CHECK-NEXT: (std::unique_ptr<int,std::default_delete<int> >) unique = 42 {
101+
# CHECK-NEXT: pointer = 0x{{.*}}
102+
# CHECK-NEXT: }
103+
# CHECK-NEXT: (lldb) fr v opt
104+
# CHECK-NEXT: (std::optional<std::basic_string<char16_t,std::char_traits<char16_t>,std::allocator<char16_t> > >) opt = Has Value=true {
105+
# CHECK-NEXT: Value = u"abc"
106+
# CHECK-NEXT: }
107+
# CHECK-NEXT: (lldb) fr v str
108+
# CHECK-NEXT: (std::basic_string<char,std::char_traits<char>,std::allocator<char> >) str = "str"
109+
# CHECK-NEXT: (lldb) fr v wStr
110+
# CHECK-NEXT: (std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >) wStr = L"wstr"
111+
# CHECK-NEXT: (lldb) fr v tuple
112+
# CHECK-NEXT: (std::tuple<int,bool,float>) tuple = size=3 {
113+
# CHECK-NEXT: [0] = 1
114+
# CHECK-NEXT: [1] = false
115+
# CHECK-NEXT: [2] = 4.{{.*}}
116+
# CHECK-NEXT: }
117+
# CHECK-NEXT: (lldb) fr v map
118+
# CHECK-NEXT: (std::map<int,int,std::less<int>,std::allocator<std::pair<const int,int> > >) map = size=3 {
119+
# CHECK-NEXT: [0] = (first = 1, second = 2)
120+
# CHECK-NEXT: [1] = (first = 2, second = 4)
121+
# CHECK-NEXT: [2] = (first = 3, second = 6)
122+
# CHECK-NEXT: }
123+
# CHECK-NEXT: (lldb) fr v mapIt
124+
# CHECK-NEXT: (std::_Tree_iterator<std::_Tree_val<std::_Tree_simple_types<std::pair<const int,int> > > >) mapIt = {
125+
# CHECK-NEXT: first = 3
126+
# CHECK-NEXT: second = 6
127+
# CHECK-NEXT: }
128+
# CHECK-NEXT: (lldb) fr v set
129+
# CHECK-NEXT: (std::set<int,std::less<int>,std::allocator<int> >) set = size=3 {
130+
# CHECK-NEXT: [0] = 1
131+
# CHECK-NEXT: [1] = 2
132+
# CHECK-NEXT: [2] = 3
133+
# CHECK-NEXT: }
134+
# CHECK-NEXT: (lldb) fr v mMap
135+
# CHECK-NEXT: (std::multimap<int,int,std::less<int>,std::allocator<std::pair<const int,int> > >) mMap = size=3 {
136+
# CHECK-NEXT: [0] = (first = 1, second = 2)
137+
# CHECK-NEXT: [1] = (first = 1, second = 1)
138+
# CHECK-NEXT: [2] = (first = 2, second = 4)
139+
# CHECK-NEXT: }
140+
# CHECK-NEXT: (lldb) fr v mSet
141+
# CHECK-NEXT: (std::multiset<int,std::less<int>,std::allocator<int> >) mSet = size=3 {
142+
# CHECK-NEXT: [0] = 1
143+
# CHECK-NEXT: [1] = 2
144+
# CHECK-NEXT: [2] = 3
145+
# CHECK-NEXT: }
146+
# CHECK-NEXT: (lldb) fr v variant
147+
# CHECK-NEXT: (std::variant<int,float,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::monostate>) variant = Active Type = std::basic_string<char,std::char_traits<char>,std::allocator<char> > {
148+
# CHECK-NEXT: Value = "wow"
149+
# CHECK-NEXT: }
150+
# CHECK-NEXT: (lldb) fr v list
151+
# CHECK-NEXT: (std::list<int,std::allocator<int> >) list = size=3 {
152+
# CHECK-NEXT: [0] = 1
153+
# CHECK-NEXT: [1] = 2
154+
# CHECK-NEXT: [2] = 3
155+
# CHECK-NEXT: }
156+
# CHECK-NEXT: (lldb) fr v fwList
157+
# CHECK-NEXT: (std::forward_list<int,std::allocator<int> >) fwList = size=3 {
158+
# CHECK-NEXT: [0] = 1
159+
# CHECK-NEXT: [1] = 2
160+
# CHECK-NEXT: [2] = 3
161+
# CHECK-NEXT: }
162+
# CHECK-NEXT: (lldb) fr v uMap
163+
# CHECK-NEXT: (std::unordered_map<int,int,std::hash<int>,std::equal_to<int>,std::allocator<std::pair<const int,int> > >) uMap = size=3 {
164+
# CHECK-NEXT: [0] = (first = 1, second = 2)
165+
# CHECK-NEXT: [1] = (first = 2, second = 4)
166+
# CHECK-NEXT: [2] = (first = 3, second = 6)
167+
# CHECK-NEXT: }
168+
# CHECK-NEXT: (lldb) fr v uSet
169+
# CHECK-NEXT: (std::unordered_set<int,std::hash<int>,std::equal_to<int>,std::allocator<int> >) uSet = size=3 {
170+
# CHECK-NEXT: [0] = 1
171+
# CHECK-NEXT: [1] = 2
172+
# CHECK-NEXT: [2] = 4
173+
# CHECK-NEXT: }
174+
# CHECK-NEXT: (lldb) fr v uMMap
175+
# CHECK-NEXT: (std::unordered_multimap<int,int,std::hash<int>,std::equal_to<int>,std::allocator<std::pair<const int,int> > >) uMMap = size=3 {
176+
# CHECK-NEXT: [0] = (first = 1, second = 2)
177+
# CHECK-NEXT: [1] = (first = 1, second = 1)
178+
# CHECK-NEXT: [2] = (first = 2, second = 4)
179+
# CHECK-NEXT: }
180+
# CHECK-NEXT: (lldb) fr v uMSet
181+
# CHECK-NEXT: (std::unordered_multiset<int,std::hash<int>,std::equal_to<int>,std::allocator<int> >) uMSet = size=3 {
182+
# CHECK-NEXT: [0] = 1
183+
# CHECK-NEXT: [1] = 1
184+
# CHECK-NEXT: [2] = 2
185+
# CHECK-NEXT: }
186+
# CHECK-NEXT: (lldb) fr v deque
187+
# CHECK-NEXT: (std::deque<int,std::allocator<int> >) deque = size=3 {
188+
# CHECK-NEXT: [0] = 1
189+
# CHECK-NEXT: [1] = 2
190+
# CHECK-NEXT: [2] = 3
191+
# CHECK-NEXT: }
192+
# CHECK-NEXT: (lldb) fr v vec
193+
# CHECK-NEXT: (std::vector<int,std::allocator<int> >) vec = size=3 {
194+
# CHECK-NEXT: [0] = 1
195+
# CHECK-NEXT: [1] = 2
196+
# CHECK-NEXT: [2] = 3
197+
# CHECK-NEXT: }

0 commit comments

Comments
 (0)