diff options
author | Paul Herman <paulherman@google.com> | 2015-09-15 23:44:17 +0000 |
---|---|---|
committer | Paul Herman <paulherman@google.com> | 2015-09-15 23:44:17 +0000 |
commit | d628cbb999070e30986a5f9b24b3ffe8ebcd6bc4 (patch) | |
tree | 029f2d84d919aaf8a6902d3f5e5daa2d80cb9101 /lldb/test/lang/cpp | |
parent | dff84070da5ca09ab89c87036f01e21b31f81a0f (diff) | |
download | bcm5719-llvm-d628cbb999070e30986a5f9b24b3ffe8ebcd6bc4.tar.gz bcm5719-llvm-d628cbb999070e30986a5f9b24b3ffe8ebcd6bc4.zip |
Search variables based on clang::DeclContext and clang::Decl tree
Summary: SymbolFileDWARF now creates VarDecl and BlockDecl and adds them to the Decl tree. Then, in ClangExpressionDeclMap it uses the Decl tree to search for a variable. This fixes lots of variable scoping problems.
Reviewers: sivachandra, chaoren, spyffe, clayborg
Subscribers: tberghammer, jingham, lldb-commits
Differential Revision: http://reviews.llvm.org/D12658
llvm-svn: 247746
Diffstat (limited to 'lldb/test/lang/cpp')
-rw-r--r-- | lldb/test/lang/cpp/nsimport/TestCppNsImport.py | 33 | ||||
-rw-r--r-- | lldb/test/lang/cpp/nsimport/main.cpp | 50 |
2 files changed, 80 insertions, 3 deletions
diff --git a/lldb/test/lang/cpp/nsimport/TestCppNsImport.py b/lldb/test/lang/cpp/nsimport/TestCppNsImport.py index d28f075b417..5415c3dae18 100644 --- a/lldb/test/lang/cpp/nsimport/TestCppNsImport.py +++ b/lldb/test/lang/cpp/nsimport/TestCppNsImport.py @@ -16,6 +16,8 @@ class TestCppNsImport(TestBase): self.buildDsym() self.check() + # This test is expected to fail because DW_TAG_imported_declaration and DW_TAG_imported_module are not parsed in SymbolFileDWARF + @expectedFailureAll @dwarf_test def test_with_dwarf_and_run_command(self): """Tests imported namespaces in C++.""" @@ -45,6 +47,8 @@ class TestCppNsImport(TestBase): # Break on main function break_0 = target.BreakpointCreateBySourceRegex("// break 0", src_file_spec) self.assertTrue(break_0.IsValid() and break_0.GetNumLocations() >= 1, VALID_BREAKPOINT) + break_1 = target.BreakpointCreateBySourceRegex("// break 1", src_file_spec) + self.assertTrue(break_1.IsValid() and break_1.GetNumLocations() >= 1, VALID_BREAKPOINT) # Launch the process args = None @@ -72,6 +76,35 @@ class TestCppNsImport(TestBase): test_result = frame.EvaluateExpression("anon") self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 2, "anon = 2") + test_result = frame.EvaluateExpression("global") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 4, "global = 4") + + test_result = frame.EvaluateExpression("fun_var") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 9, "fun_var = 9") + + test_result = frame.EvaluateExpression("not_imported") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 35, "not_imported = 35") + + test_result = frame.EvaluateExpression("imported") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 99, "imported = 99") + + test_result = frame.EvaluateExpression("single") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 3, "single = 3") + + # Continue to second breakpoint + process.Continue() + + # Get the thread of the process + self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED) + thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) + + # Get current fream of the thread at the breakpoint + frame = thread.GetSelectedFrame() + + # Test function inside namespace + test_result = frame.EvaluateExpression("fun_var") + self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 5, "fun_var = 5") + if __name__ == '__main__': import atexit diff --git a/lldb/test/lang/cpp/nsimport/main.cpp b/lldb/test/lang/cpp/nsimport/main.cpp index e5d5b7059b0..e125ebaa243 100644 --- a/lldb/test/lang/cpp/nsimport/main.cpp +++ b/lldb/test/lang/cpp/nsimport/main.cpp @@ -16,13 +16,57 @@ namespace Nested } } -using namespace N; -using namespace Nested; +namespace Global +{ + int global; +} + +namespace Fun +{ + int fun_var; + int fun() + { + fun_var = 5; + return 0; // break 1 + } +} + +namespace Single +{ + int single = 3; +} + +namespace NotImportedBefore +{ + int not_imported = 45; +} + +using namespace Global; + +int not_imported = 35; +int fun_var = 9; + +namespace NotImportedAfter +{ + int not_imported = 55; +} + +namespace Imported +{ + int imported = 99; +} + +int imported = 89; int main() { + using namespace N; + using namespace Nested; + using namespace Imported; + using Single::single; n = 1; anon = 2; nested = 3; - return 0; // break 0 + global = 4; + return Fun::fun(); // break 0 } |