[lldb][test] Move std::function from libcxx to generic directory (#147701)

This just moves the test from `libcxx` to `generic`. There are currently
no `std::function` formatters for libstdc++ so I didn't add a test-case
for it.

Split out from https://github.com/llvm/llvm-project/pull/146740
This commit is contained in:
Michael Buch 2025-07-09 22:16:59 +01:00 committed by GitHub
parent 2fc6c73b39
commit 9d8058e3b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 55 additions and 63 deletions

View File

@ -1,5 +1,3 @@
CXX_SOURCES := main.cpp
CXXFLAGS_EXTRAS := -std=c++11
USE_LIBCPP := 1
include Makefile.rules

View File

@ -2,14 +2,13 @@
Test lldb data formatter subsystem.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class LibCxxFunctionTestCase(TestBase):
class StdFunctionTestCase(TestBase):
# Run frame var for a variable twice. Verify we do not hit the cache
# the first time but do the second time.
def run_frame_var_check_cache_use(
@ -34,10 +33,8 @@ class LibCxxFunctionTestCase(TestBase):
substrs=["lldb_private::CompileUnit::FindFunction"],
)
@add_test_categories(["libc++"])
def test(self):
"""Test that std::function as defined by libc++ is correctly printed by LLDB"""
self.build()
def do_test(self):
"""Test that std::function is correctly printed by LLDB"""
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
bkpt = self.target().FindBreakpointByID(
@ -56,20 +53,20 @@ class LibCxxFunctionTestCase(TestBase):
)
self.run_frame_var_check_cache_use(
"foo2_f", "Lambda in File main.cpp at Line 22"
"foo2_f", "Lambda in File main.cpp at Line 16"
)
lldbutil.continue_to_breakpoint(self.process(), bkpt)
self.run_frame_var_check_cache_use(
"add_num2_f", "Lambda in File main.cpp at Line 13"
"add_num2_f", "Lambda in File main.cpp at Line 9"
)
lldbutil.continue_to_breakpoint(self.process(), bkpt)
self.run_frame_var_check_cache_use("f2", "Lambda in File main.cpp at Line 35")
self.run_frame_var_check_cache_use("f2", "Lambda in File main.cpp at Line 26")
self.run_frame_var_check_cache_use(
"f3", "Lambda in File main.cpp at Line 39", True
"f3", "Lambda in File main.cpp at Line 30", True
)
# TODO reenable this case when std::function formatter supports
# general callable object case.
@ -82,3 +79,8 @@ class LibCxxFunctionTestCase(TestBase):
self.expect(
"frame variable f5", substrs=["f5 = Function = Bar::add_num(int) const"]
)
@add_test_categories(["libc++"])
def test_libcxx(self):
self.build(dictionary={"USE_LIBCPP": 1})
self.do_test()

View File

@ -0,0 +1,43 @@
#include <functional>
int foo(int x, int y) { return x + y - 1; }
struct Bar {
int operator()() { return 66; }
int add_num(int i) const { return i + 3; }
int add_num2(int i) {
std::function<int(int)> add_num2_f = [](int x) { return x + 1; };
return add_num2_f(i); // Set break point at this line.
}
};
int foo2() {
auto f = [](int x) { return x + 1; };
std::function<int(int)> foo2_f = f;
return foo2_f(10); // Set break point at this line.
}
int main(int argc, char *argv[]) {
int acc = 42;
std::function<int(int, int)> f1 = foo;
std::function<int(int)> f2 = [acc, f1](int x) -> int {
return x + f1(acc, x);
};
auto f = [](int x, int y) { return x + y; };
auto g = [](int x, int y) { return x * y; };
std::function<int(int, int)> f3 = argc % 2 ? f : g;
Bar bar1;
std::function<int()> f4(bar1);
std::function<int(const Bar &, int)> f5 = &Bar::add_num;
int foo2_result = foo2();
int bar_add_num2_result = bar1.add_num2(10);
return f1(acc, acc) + f2(acc) + f3(acc + 1, acc + 2) + f4() +
f5(bar1, 10); // Set break point at this line.
}

View File

@ -1,51 +0,0 @@
#include <functional>
int foo(int x, int y) {
return x + y - 1;
}
struct Bar {
int operator()() {
return 66 ;
}
int add_num(int i) const { return i + 3 ; }
int add_num2(int i) {
std::function<int (int)> add_num2_f = [](int x) {
return x+1;
};
return add_num2_f(i); // Set break point at this line.
}
} ;
int foo2() {
auto f = [](int x) {
return x+1;
};
std::function<int (int)> foo2_f = f;
return foo2_f(10); // Set break point at this line.
}
int main (int argc, char *argv[])
{
int acc = 42;
std::function<int (int,int)> f1 = foo;
std::function<int (int)> f2 = [acc,f1] (int x) -> int {
return x+f1(acc,x);
};
auto f = [](int x, int y) { return x + y; };
auto g = [](int x, int y) { return x * y; } ;
std::function<int (int,int)> f3 = argc %2 ? f : g ;
Bar bar1 ;
std::function<int ()> f4( bar1 ) ;
std::function<int (const Bar&, int)> f5 = &Bar::add_num;
int foo2_result = foo2();
int bar_add_num2_result = bar1.add_num2(10);
return f1(acc,acc) + f2(acc) + f3(acc+1,acc+2) + f4() + f5(bar1, 10); // Set break point at this line.
}