diff options
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test')
3 files changed, 94 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/template/Makefile b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/Makefile new file mode 100644 index 00000000000..194af7b3239 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/Makefile @@ -0,0 +1,7 @@ +LEVEL = ../../../make + +CXX_SOURCES := main.cpp + +CFLAGS_EXTRAS += $(NO_LIMIT_DEBUG_INFO_FLAGS) + +include $(LEVEL)/Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py new file mode 100644 index 00000000000..15b18e34f71 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/TestTemplateIntegerArgs.py @@ -0,0 +1,62 @@ +""" +Tests that C++ templates work as expected +""" +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TemplateIntegerArgsTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def test_with_run_command(self): + """Test that C++ template classes that have integer parameters work correctly. + + We must reconstruct the types correctly so the template types are correct + and display correctly, and also make sure the expression parser works and + is able the find all needed functions when evaluating expressions""" + self.build() + + # Set debugger into synchronous mode + self.dbg.SetAsync(False) + + # Create a target by the debugger. + exe = os.path.join(os.getcwd(), "a.out") + target = self.dbg.CreateTarget(exe) + self.assertTrue(target, VALID_TARGET) + + # Set breakpoints inside and outside methods that take pointers to the containing struct. + line = line_number('main.cpp', '// Breakpoint 1') + lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=True) + + arguments = None + environment = None + + # Now launch the process, and do not stop at entry point. + process = target.LaunchSimple (arguments, environment, self.get_process_working_directory()) + self.assertTrue(process, PROCESS_IS_VALID) + + # Get the thread of the process + self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED) + thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) + + # Get frame for current thread + frame = thread.GetSelectedFrame() + + testpos = frame.FindVariable('testpos') + self.assertTrue(testpos.IsValid(), 'make sure we find a local variabble named "testpos"') + self.assertTrue(testpos.GetType().GetName() == 'TestObj<1>') + expr_result = frame.EvaluateExpression("testpos.getArg()") + self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "testpos.getArg()"'); + self.assertTrue(expr_result.GetValue() == "1", "testpos.getArg() == 1") + self.assertTrue(expr_result.GetType().GetName() == "int", 'expr_result.GetType().GetName() == "int"') + + testneg = frame.FindVariable('testneg') + self.assertTrue(testneg.IsValid(), 'make sure we find a local variabble named "testneg"') + self.assertTrue(testneg.GetType().GetName() == 'TestObj<-1>') + + expr_result = frame.EvaluateExpression("testneg.getArg()") + self.assertTrue(expr_result.IsValid(), 'got a valid expression result from expression "testneg.getArg()"'); + self.assertTrue(expr_result.GetValue() == "-1", "testneg.getArg() == -1") + self.assertTrue(expr_result.GetType().GetName() == "int", 'expr_result.GetType().GetName() == "int"') diff --git a/lldb/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp new file mode 100644 index 00000000000..10a4bec62e9 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/cpp/template/main.cpp @@ -0,0 +1,25 @@ +//===-- main.cpp ------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +template <int Arg> +class TestObj +{ +public: + int getArg() + { + return Arg; + } +}; + +int main(int argc, char **argv) +{ + TestObj<1> testpos; + TestObj<-1> testneg; + return testpos.getArg() - testneg.getArg(); // Breakpoint 1 +} |