[Lldb-commits] [PATCH] D69209: [lldb] Add test for running static initializers in expressions.

Raphael Isemann via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Fri Oct 18 17:38:09 PDT 2019


teemperor created this revision.
Herald added subscribers: lldb-commits, JDevlieghere.
Herald added a project: LLDB.
teemperor added a comment.

Just dumping this here because I don't want to anger the build bots before going into the weekend.


While reading ClangExpressionParser source code I saw a bunch of code that
specifically handles running all the static initializers in expressions. The coverage
bot tells me that we never actually test this code anywhere, so let's add some
testing to that feature.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D69209

Files:
  lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/Makefile
  lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/TestStaticInitializers.py
  lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/main.cpp


Index: lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/main.cpp
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/main.cpp
@@ -0,0 +1,11 @@
+#include <cstdlib>
+
+int counter = 0;
+
+void inc_counter() { ++counter; }
+
+void do_abort() { abort(); }
+
+int main() {
+  return 0; // break here
+}
Index: lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/TestStaticInitializers.py
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/TestStaticInitializers.py
@@ -0,0 +1,31 @@
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+class StaticInitializers(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    def test(self):
+        """ Test a static initializer. """
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(self, '// break here',
+                lldb.SBFileSpec("main.cpp", False))
+
+        # We use counter to observe if the initializer was called.
+        self.expect("expr counter", substrs=["(int) $", " = 0"])
+        self.expect("expr -p -- struct Foo { Foo() { inc_counter(); } }; Foo f;")
+        self.expect("expr counter", substrs=["(int) $", " = 1"])
+
+    def test_failing_init(self):
+        """ Test a static initializer that fails to execute. """
+        self.build()
+
+        lldbutil.run_to_source_breakpoint(self, '// break here',
+                lldb.SBFileSpec("main.cpp", False))
+
+        # FIXME: This error message is not even remotely helpful.
+        self.expect("expr -p -- struct Foo2 { Foo2() { do_abort(); } }; Foo2 f;", error=True,
+                    substrs=["error: couldn't run static initializers: couldn't run static initializer:"])
Index: lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/Makefile
===================================================================
--- /dev/null
+++ lldb/packages/Python/lldbsuite/test/commands/expression/static-initializers/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69209.225724.patch
Type: text/x-patch
Size: 2308 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20191019/4637e68a/attachment.bin>


More information about the lldb-commits mailing list