summaryrefslogtreecommitdiffstats
path: root/lldb/packages/Python/lldbsuite/test/expression_command
diff options
context:
space:
mode:
authorRaphael Isemann <teemperor@gmail.com>2019-04-30 08:41:35 +0000
committerRaphael Isemann <teemperor@gmail.com>2019-04-30 08:41:35 +0000
commitf74a4c1f6df9a2ccc2c871113a527c1dc2c874e3 (patch)
tree71929d593f2a22d890b4b8d36666ecc5d6a2a4e6 /lldb/packages/Python/lldbsuite/test/expression_command
parent180f1ae57c9dfe7725b0eea1b6e463d933bced86 (diff)
downloadbcm5719-llvm-f74a4c1f6df9a2ccc2c871113a527c1dc2c874e3.tar.gz
bcm5719-llvm-f74a4c1f6df9a2ccc2c871113a527c1dc2c874e3.zip
Instantiate 'std' templates explicitly in the expression evaluator
Summary: This patch is a follow-up for D58125. It implements the manual instantiation and merging of 'std' templates like `std::vector` and `std::shared_ptr` with information from the debug info AST. This (finally) allows using these classes in the expression evaluator like every other class (i.e. things like `vec.size()` and shared_ptr debugging now works, yay!). The main logic is the `CxxModuleHandler` which intercept the ASTImporter import process and replaces any `std` decls by decls from the C++ module. The decls from the C++ module are "imported" by just deserializing them directly in the expression evaluation context. This is mostly because we don't want to rely on the ASTImporter to correctly import these declarations, but in the future we should also move to the ASTImporter for that. This patch doesn't contain the automatic desugaring for result variables. This means that if you call for example `size` of `std::vector` you maybe get some very verbose typedef'd type as the variable type, e.g. `std::vector<int, std::allocator<int>>::value_type`. This is not only unreadable, it also means that our ASTImporter has to import all these types and associated decls into the persisent variable context. This currently usually leads to some assertion getting triggered in Clang when the ASTImporter either makes a mistake during importing or our debug info AST is inconsitent. The current workaround I use in the tests is to just cast the result to it's actual type (e.g. `size_t` or `int`) to prevent the ASTImporter from having to handle all these complicated decls. The automatic desugaring will be a future patch because I'm not happy yet with the current code for that and because I anticipate that this will be a controversial patch. Reviewers: aprantl, shafik, jingham, martong, serge-sans-paille Reviewed By: martong Subscribers: balazske, rnkovacs, mgorny, mgrang, abidh, jdoerfert, lldb-commits Tags: #c_modules_in_lldb, #lldb Differential Revision: https://reviews.llvm.org/D59537 llvm-svn: 359538
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/expression_command')
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py41
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py37
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/main.cpp10
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py34
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py31
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/main.cpp10
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py41
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py38
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/main.cpp10
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/main.cpp11
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/main.cpp7
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/main.cpp11
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/main.cpp7
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py57
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py34
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py47
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/main.cpp10
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py30
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/main.cpp6
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/main.cpp12
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/Makefile5
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py33
-rw-r--r--lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/main.cpp8
48 files changed, 800 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py
new file mode 100644
index 00000000000..0ede19e8350
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/TestBasicDeque.py
@@ -0,0 +1,41 @@
+"""
+Test basic std::list functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestBasicDeque(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a.back()", substrs=['(int) $2 = 2'])
+
+ self.expect("expr std::sort(a.begin(), a.end())")
+ self.expect("expr (int)a.front()", substrs=['(int) $3 = 1'])
+ self.expect("expr (int)a.back()", substrs=['(int) $4 = 3'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front()", substrs=['(int) $5 = 3'])
+ self.expect("expr (int)a.back()", substrs=['(int) $6 = 1'])
+
+ self.expect("expr (int)(*a.begin())", substrs=['(int) $7 = 3'])
+ self.expect("expr (int)(*a.rbegin())", substrs=['(int) $8 = 1'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/main.cpp
new file mode 100644
index 00000000000..5bed55674bf
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-basic/main.cpp
@@ -0,0 +1,6 @@
+#include <deque>
+
+int main(int argc, char **argv) {
+ std::deque<int> a = {3, 1, 2};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py
new file mode 100644
index 00000000000..4df280f32d1
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/TestDbgInfoContentDeque.py
@@ -0,0 +1,37 @@
+"""
+Test std::deque functionality with a decl from dbg info as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestDbgInfoContentDeque(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()->a", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a.back()->a", substrs=['(int) $2 = 2'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front()->a", substrs=['(int) $3 = 2'])
+ self.expect("expr (int)a.back()->a", substrs=['(int) $4 = 3'])
+
+ self.expect("expr (int)(a.begin()->a)", substrs=['(int) $5 = 2'])
+ self.expect("expr (int)(a.rbegin()->a)", substrs=['(int) $6 = 3'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..f8fd1fb2dd9
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/deque-dbg-info-content/main.cpp
@@ -0,0 +1,10 @@
+#include <deque>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::deque<Foo> a = {{3}, {1}, {2}};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py
new file mode 100644
index 00000000000..5cbc73d34c0
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/TestBasicForwardList.py
@@ -0,0 +1,34 @@
+"""
+Test basic std::forward_list functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestBasicList(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)std::distance(a.begin(), a.end())", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()", substrs=['(int) $1 = 3'])
+
+ self.expect("expr a.sort()")
+ self.expect("expr (int)a.front()", substrs=['(int) $2 = 1'])
+
+ self.expect("expr (int)(*a.begin())", substrs=['(int) $3 = 1'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/main.cpp
new file mode 100644
index 00000000000..4f5e30f0629
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-basic/main.cpp
@@ -0,0 +1,6 @@
+#include <forward_list>
+
+int main(int argc, char **argv) {
+ std::forward_list<int> a = {3, 1, 2};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py
new file mode 100644
index 00000000000..6e7be3ec00f
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/TestDbgInfoContentForwardList.py
@@ -0,0 +1,31 @@
+"""
+Test std::forward_list functionality with a decl from debug info as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestDbgInfoContentForwardList(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)std::distance(a.begin(), a.end())", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()->a", substrs=['(int) $1 = 3'])
+
+ self.expect("expr (int)(a.begin()->a)", substrs=['(int) $2 = 3'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..b1ffc4b24cd
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/forward_list-dbg-info-content/main.cpp
@@ -0,0 +1,10 @@
+#include <forward_list>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::forward_list<Foo> a = {{3}, {1}, {2}};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py
new file mode 100644
index 00000000000..154c8ed7bd0
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/TestBasicList.py
@@ -0,0 +1,41 @@
+"""
+Test basic std::list functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestBasicList(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a.back()", substrs=['(int) $2 = 2'])
+
+ self.expect("expr a.sort()")
+ self.expect("expr (int)a.front()", substrs=['(int) $3 = 1'])
+ self.expect("expr (int)a.back()", substrs=['(int) $4 = 3'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front()", substrs=['(int) $5 = 3'])
+ self.expect("expr (int)a.back()", substrs=['(int) $6 = 1'])
+
+ self.expect("expr (int)(*a.begin())", substrs=['(int) $7 = 3'])
+ self.expect("expr (int)(*a.rbegin())", substrs=['(int) $8 = 1'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/main.cpp
new file mode 100644
index 00000000000..e54719a02fb
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-basic/main.cpp
@@ -0,0 +1,6 @@
+#include <list>
+
+int main(int argc, char **argv) {
+ std::list<int> a = {3, 1, 2};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py
new file mode 100644
index 00000000000..713ec1abb85
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/TestDbgInfoContentList.py
@@ -0,0 +1,38 @@
+"""
+Test basic std::list functionality but with a declaration from
+the debug info (the Foo struct) as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestDbgInfoContentList(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front().a", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a.back().a", substrs=['(int) $2 = 2'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front().a", substrs=['(int) $3 = 2'])
+ self.expect("expr (int)a.back().a", substrs=['(int) $4 = 3'])
+
+ self.expect("expr (int)(a.begin()->a)", substrs=['(int) $5 = 2'])
+ self.expect("expr (int)(a.rbegin()->a)", substrs=['(int) $6 = 3'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..3cfb35f8c6b
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/list-dbg-info-content/main.cpp
@@ -0,0 +1,10 @@
+#include <list>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::list<Foo> a = {{3}, {1}, {2}};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py
new file mode 100644
index 00000000000..1e4309f6795
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/TestSharedPtrDbgInfoContent.py
@@ -0,0 +1,33 @@
+"""
+Test std::shared_ptr functionality with a class from debug info as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestSharedPtr(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)s->a", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(s->a = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)s->a", substrs=['(int) $2 = 5'])
+ self.expect("expr (bool)s", substrs=['(bool) $3 = true'])
+ self.expect("expr s.reset()")
+ self.expect("expr (bool)s", substrs=['(bool) $4 = false'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..73664f1c83a
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr-dbg-info-content/main.cpp
@@ -0,0 +1,11 @@
+#include <memory>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::shared_ptr<Foo> s(new Foo);
+ s->a = 3;
+ return s->a; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py
new file mode 100644
index 00000000000..6f1e7b12d1f
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/TestSharedPtr.py
@@ -0,0 +1,33 @@
+"""
+Test basic std::shared_ptr functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestSharedPtr(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)*s", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(*s = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)*s", substrs=['(int) $2 = 5'])
+ self.expect("expr (bool)s", substrs=['(bool) $3 = true'])
+ self.expect("expr s.reset()")
+ self.expect("expr (bool)s", substrs=['(bool) $4 = false'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/main.cpp
new file mode 100644
index 00000000000..cb81754087f
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/shared_ptr/main.cpp
@@ -0,0 +1,7 @@
+#include <memory>
+
+int main(int argc, char **argv) {
+ std::shared_ptr<int> s(new int);
+ *s = 3;
+ return *s; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py
new file mode 100644
index 00000000000..c321d8022e1
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/TestUniquePtrDbgInfoContent.py
@@ -0,0 +1,33 @@
+"""
+Test std::unique_ptr functionality with a decl from debug info as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestUniquePtrDbgInfoContent(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)s->a", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(s->a = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)s->a", substrs=['(int) $2 = 5'])
+ self.expect("expr (bool)s", substrs=['(bool) $3 = true'])
+ self.expect("expr s.reset()")
+ self.expect("expr (bool)s", substrs=['(bool) $4 = false'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..73664f1c83a
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr-dbg-info-content/main.cpp
@@ -0,0 +1,11 @@
+#include <memory>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::shared_ptr<Foo> s(new Foo);
+ s->a = 3;
+ return s->a; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py
new file mode 100644
index 00000000000..295ec512327
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/TestUniquePtr.py
@@ -0,0 +1,33 @@
+"""
+Test basic std::unique_ptr functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestUniquePtr(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)*s", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(*s = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)*s", substrs=['(int) $2 = 5'])
+ self.expect("expr (bool)s", substrs=['(bool) $3 = true'])
+ self.expect("expr s.reset()")
+ self.expect("expr (bool)s", substrs=['(bool) $4 = false'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/main.cpp
new file mode 100644
index 00000000000..cb81754087f
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/unique_ptr/main.cpp
@@ -0,0 +1,7 @@
+#include <memory>
+
+int main(int argc, char **argv) {
+ std::shared_ptr<int> s(new int);
+ *s = 3;
+ return *s; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py
new file mode 100644
index 00000000000..deaf8f0cb75
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/TestBasicVector.py
@@ -0,0 +1,57 @@
+"""
+Test basic std::vector functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestBasicVector(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front()", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a[1]", substrs=['(int) $2 = 1'])
+ self.expect("expr (int)a.back()", substrs=['(int) $3 = 2'])
+
+ self.expect("expr std::sort(a.begin(), a.end())")
+ self.expect("expr (int)a.front()", substrs=['(int) $4 = 1'])
+ self.expect("expr (int)a[1]", substrs=['(int) $5 = 2'])
+ self.expect("expr (int)a.back()", substrs=['(int) $6 = 3'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front()", substrs=['(int) $7 = 3'])
+ self.expect("expr (int)a[1]", substrs=['(int) $8 = 2'])
+ self.expect("expr (int)a.back()", substrs=['(int) $9 = 1'])
+
+ self.expect("expr (int)(*a.begin())", substrs=['(int) $10 = 3'])
+ self.expect("expr (int)(*a.rbegin())", substrs=['(int) $11 = 1'])
+
+ self.expect("expr a.pop_back()")
+ self.expect("expr (int)a.back()", substrs=['(int) $12 = 2'])
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $13 = 2'])
+
+ self.expect("expr (int)a.at(0)", substrs=['(int) $14 = 3'])
+
+ self.expect("expr a.push_back(4)")
+ self.expect("expr (int)a.back()", substrs=['(int) $15 = 4'])
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $16 = 3'])
+
+ self.expect("expr a.emplace_back(5)")
+ self.expect("expr (int)a.back()", substrs=['(int) $17 = 5'])
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $18 = 4'])
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/main.cpp
new file mode 100644
index 00000000000..edf130d4748
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-basic/main.cpp
@@ -0,0 +1,6 @@
+#include <vector>
+
+int main(int argc, char **argv) {
+ std::vector<int> a = {3, 1, 2};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py
new file mode 100644
index 00000000000..0ab52695faf
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/TestBoolVector.py
@@ -0,0 +1,34 @@
+"""
+Test basic std::vector<bool> functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestBoolVector(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 4'])
+ self.expect("expr (bool)a.front()", substrs=['(bool) $1 = false'])
+ self.expect("expr (bool)a[1]", substrs=['(bool) $2 = true'])
+ self.expect("expr (bool)a.back()", substrs=['(bool) $3 = true'])
+
+ self.expect("expr (bool)(*a.begin())", substrs=['(bool) $4 = false'])
+ self.expect("expr (bool)(*a.rbegin())", substrs=['(bool) $5 = true'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/main.cpp
new file mode 100644
index 00000000000..9554401cf50
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-bool/main.cpp
@@ -0,0 +1,6 @@
+#include <vector>
+
+int main(int argc, char **argv) {
+ std::vector<bool> a = {0, 1, 0, 1};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py
new file mode 100644
index 00000000000..c89265f2cd3
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/TestDbgInfoContentVector.py
@@ -0,0 +1,47 @@
+"""
+Test basic std::vector functionality but with a declaration from
+the debug info (the Foo struct) as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestDbgInfoContentVector(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 3'])
+ self.expect("expr (int)a.front().a", substrs=['(int) $1 = 3'])
+ self.expect("expr (int)a[1].a", substrs=['(int) $2 = 1'])
+ self.expect("expr (int)a.back().a", substrs=['(int) $3 = 2'])
+
+ self.expect("expr std::reverse(a.begin(), a.end())")
+ self.expect("expr (int)a.front().a", substrs=['(int) $4 = 2'])
+
+ self.expect("expr (int)(a.begin()->a)", substrs=['(int) $5 = 2'])
+ self.expect("expr (int)(a.rbegin()->a)", substrs=['(int) $6 = 3'])
+
+ self.expect("expr a.pop_back()")
+ self.expect("expr (int)a.back().a", substrs=['(int) $7 = 1'])
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $8 = 2'])
+
+ self.expect("expr (int)a.at(0).a", substrs=['(int) $9 = 2'])
+
+ self.expect("expr a.push_back({4})")
+ self.expect("expr (int)a.back().a", substrs=['(int) $10 = 4'])
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $11 = 3'])
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..24c3fec75d2
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-dbg-info-content/main.cpp
@@ -0,0 +1,10 @@
+#include <vector>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::vector<Foo> a = {{3}, {1}, {2}};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py
new file mode 100644
index 00000000000..2b82e1a039a
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/TestVectorOfVectors.py
@@ -0,0 +1,30 @@
+"""
+Test std::vector functionality when it's contents are vectors.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestVectorOfVectors(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (size_t)a.size()", substrs=['(size_t) $0 = 2'])
+ self.expect("expr (int)a.front().front()", substrs=['(int) $1 = 1'])
+ self.expect("expr (int)a[1][1]", substrs=['(int) $2 = 2'])
+ self.expect("expr (int)a.back().at(0)", substrs=['(int) $3 = 3'])
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/main.cpp
new file mode 100644
index 00000000000..b5ada909e43
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/vector-of-vectors/main.cpp
@@ -0,0 +1,6 @@
+#include <vector>
+
+int main(int argc, char **argv) {
+ std::vector<std::vector<int> > a = {{1, 2, 3}, {3, 2, 1}};
+ return 0; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py
new file mode 100644
index 00000000000..0acd54e803c
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/TestDbgInfoContentWeakPtr.py
@@ -0,0 +1,33 @@
+"""
+Test std::weak_ptr functionality with a decl from debug info as content.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestDbgInfoContentWeakPtr(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)w.lock()->a", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(w.lock()->a = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)w.lock()->a", substrs=['(int) $2 = 5'])
+ self.expect("expr w.use_count()", substrs=['(long) $3 = 1'])
+ self.expect("expr w.reset()")
+ self.expect("expr w.use_count()", substrs=['(long) $4 = 0'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/main.cpp
new file mode 100644
index 00000000000..d2c5a6258a5
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr-dbg-info-content/main.cpp
@@ -0,0 +1,12 @@
+#include <memory>
+
+struct Foo {
+ int a;
+};
+
+int main(int argc, char **argv) {
+ std::shared_ptr<Foo> s(new Foo);
+ s->a = 3;
+ std::weak_ptr<Foo> w = s;
+ return s->a; // Set break point at this line.
+}
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/Makefile b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/Makefile
new file mode 100644
index 00000000000..01718d86aa7
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+USE_LIBCPP := 1
+CXXFLAGS += $(MANDATORY_CXXMODULE_BUILD_CFLAGS)
+CXX_SOURCES := main.cpp
+include $(LEVEL)/Makefile.rules
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py
new file mode 100644
index 00000000000..6b8b9ceb7aa
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/TestWeakPtr.py
@@ -0,0 +1,33 @@
+"""
+Test basic std::weak_ptr functionality.
+"""
+
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class TestSharedPtr(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # FIXME: This should work on more setups, so remove these
+ # skipIf's in the future.
+ @add_test_categories(["libc++"])
+ @skipIf(compiler=no_match("clang"))
+ @skipIf(oslist=no_match(["linux"]))
+ @skipIf(debug_info=no_match(["dwarf"]))
+ def test(self):
+ self.build()
+
+ lldbutil.run_to_source_breakpoint(self,
+ "// Set break point at this line.", lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd("settings set target.import-std-module true")
+
+ self.expect("expr (int)*w.lock()", substrs=['(int) $0 = 3'])
+ self.expect("expr (int)(*w.lock() = 5)", substrs=['(int) $1 = 5'])
+ self.expect("expr (int)*w.lock()", substrs=['(int) $2 = 5'])
+ self.expect("expr w.use_count()", substrs=['(long) $3 = 1'])
+ self.expect("expr w.reset()")
+ self.expect("expr w.use_count()", substrs=['(long) $4 = 0'])
+
diff --git a/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/main.cpp b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/main.cpp
new file mode 100644
index 00000000000..13479eb9496
--- /dev/null
+++ b/lldb/packages/Python/lldbsuite/test/expression_command/import-std-module/weak_ptr/main.cpp
@@ -0,0 +1,8 @@
+#include <memory>
+
+int main(int argc, char **argv) {
+ std::shared_ptr<int> s(new int);
+ *s = 3;
+ std::weak_ptr<int> w = s;
+ return *s; // Set break point at this line.
+}
OpenPOWER on IntegriCloud