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


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
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to