evgeny777 updated this revision to Diff 40497.
evgeny777 added a comment.

Hi folks!

The clang patch has been landed. I've added test cases, so please look at the 
new patch. Thanks


http://reviews.llvm.org/D13350

Files:
  packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
  packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
  packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
  source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp

Index: source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
===================================================================
--- source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
+++ source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp
@@ -1337,10 +1337,17 @@
 
         if (frame && !namespace_decl)
         {
-            CompilerDeclContext compiler_decl_context = sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() : CompilerDeclContext();
-
+            CompilerDeclContext compiler_decl_context = sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() : CompilerDeclContext();            
             if (compiler_decl_context)
-            {
+            {                
+                if (context.m_decl_context->shouldUseQualifiedLookup())
+                {
+                    // We're looking for global variable, so we need root DeclContext
+                    clang::DeclContext* dc = (clang::DeclContext*)compiler_decl_context.GetOpaqueDeclContext();
+                    while (dc->getParent())
+                        dc = dc->getParent();
+                    compiler_decl_context.SetDeclContext(compiler_decl_context.GetTypeSystem(), dc);
+                }
                 // Make sure that the variables are parsed so that we have the declarations
                 VariableListSP vars = frame->GetInScopeVariableList(true);
                 for (size_t i = 0; i < vars->GetSize(); i++)
Index: packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
===================================================================
--- packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
+++ packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
@@ -72,9 +72,8 @@
         test_result = frame.EvaluateExpression("not_imported")
         self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 35, "not_imported = 35")
 
-        # Currently there is no way to distinguish between "::imported" and "imported" in ClangExpressionDeclMap so this fails
-        #test_result = frame.EvaluateExpression("::imported")
-        #self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 89, "::imported = 89")
+        test_result = frame.EvaluateExpression("::imported")
+        self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 89, "::imported = 89")
 
         test_result = frame.EvaluateExpression("Imported::imported")
         self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 99, "Imported::imported = 99")
Index: packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
===================================================================
--- packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
+++ packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
@@ -9,6 +9,8 @@
 
 #include <cstdarg>
 
+int gvar = 10;
+
 namespace {
     typedef unsigned int my_uint_t;
     int i; // Find the line number for anonymous namespace variable i.
@@ -74,18 +76,25 @@
 
 namespace ns1 {
     int value = 100;
+    int gvar = 20;
 }
 
 namespace ns2 {
     int value = 200;
 }
 
 #include <stdio.h>
 void test_namespace_scopes() {
+    int gvar = 1;
     do {
         using namespace ns1;
         printf("ns1::value = %d\n", value); // Evaluate ns1::value
     } while(0);
+
+    do {
+        using namespace ns1;
+        printf("gvar=%d, ns1::gvar=%d, ::gvar=%d\n", gvar, ns1::gvar, ::gvar);
+    } while(0);
     
     do {
         using namespace ns2;
Index: packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
===================================================================
--- packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
+++ packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
@@ -51,10 +51,14 @@
         self.runToBkpt("run")
         # Evaluate ns1::value
         self.expect("expression -- value", startstr = "(int) $0 = 100")
-
+        # Evaluate gvar in different scopes
+        self.expect("expression -- gvar", startstr = "(int) $1 = 1")
+        self.expect("expression -- ns1::gvar", startstr = "(int) $2 = 20")
+        self.expect("expression -- ::gvar", startstr = "(int) $3 = 10")
+        
         self.runToBkpt("continue")
         # Evaluate ns2::value
-        self.expect("expression -- value", startstr = "(int) $1 = 200")
+        self.expect("expression -- value", startstr = "(int) $4 = 200")
         
         self.runToBkpt("continue")
         # On Mac OS X, gcc 4.2 emits the wrong debug info with respect to types.
@@ -97,8 +101,8 @@
         # test/namespace: 'expression -- i+j' not working
         # This has been fixed.
         self.expect("expression -- i + j",
-            startstr = "(int) $2 = 7")
-        # (int) $2 = 7
+            startstr = "(int) $5 = 7")
+        # (int) $5 = 7
 
         self.runCmd("expression -- i")
         self.runCmd("expression -- j")
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to