xref: /llvm-project/lldb/test/API/lang/cpp/libcxx-internals-recognizer/main.cpp (revision 7e16571eb02e7e9da24fee45359e981af783d0d0)
1 #include <algorithm>
2 #include <functional>
3 #include <map>
4 #include <ranges>
5 #include <vector>
6 
7 bool sort_less(int a, int b) {
8   __builtin_printf("break here");
9   return a < b;
10 }
11 
12 bool ranges_sort_less(int a, int b) {
13   __builtin_printf("break here");
14   return a < b;
15 }
16 
17 int view_transform(int a) {
18   __builtin_printf("break here");
19   return a * a;
20 }
21 
22 void test_algorithms() {
23   std::vector<int> vec{8, 1, 3, 2};
24 
25   // The internal frames for `std::sort` should be hidden
26   std::sort(vec.begin(), vec.end(), sort_less);
27 
28   // The internal frames for `ranges::sort` should be hidden
29   std::ranges::sort(vec.begin(), vec.end(), ranges_sort_less);
30 
31   // Same for views
32   for (auto x : vec | std::ranges::views::transform(view_transform)) {
33     // no-op
34   }
35 }
36 
37 void consume_number(int i) { __builtin_printf("break here"); }
38 
39 int invoke_add(int i, int j) {
40   __builtin_printf("break here");
41   return i + j;
42 }
43 
44 struct Callable {
45   Callable(int num) : num_(num) {}
46   void operator()(int i) const { __builtin_printf("break here"); }
47   void member_function(int i) const { __builtin_printf("break here"); }
48   int num_;
49 };
50 
51 void test_invoke() {
52   // Invoke a void-returning function
53   std::invoke(consume_number, -9);
54 
55   // Invoke a non-void-returning function
56   std::invoke(invoke_add, 1, 10);
57 
58   // Invoke a member function
59   const Callable foo(314159);
60   std::invoke(&Callable::member_function, foo, 1);
61 
62   // Invoke a function object
63   std::invoke(Callable(12), 18);
64 }
65 
66 struct MyKey {
67   int x;
68   bool operator==(const MyKey &) const = default;
69   bool operator<(const MyKey &other) const {
70     __builtin_printf("break here");
71     return x < other.x;
72   }
73 };
74 
75 void test_containers() {
76   std::map<MyKey, int> map;
77   map.emplace(MyKey{1}, 2);
78   map.emplace(MyKey{2}, 3);
79 }
80 
81 int main() {
82   test_algorithms();
83   test_invoke();
84   test_containers();
85   return 0;
86 }
87