shafik created this revision. shafik added reviewers: jingham, teemperor. Herald added a subscriber: jdoerfert.
In an Objective-C context a local variable and namespace can cause an ambiguous name lookup when used in an expression. The solution involves mimicking the existing C++ solution which is to add local using declarations for local variables. This causes a different type of lookup to be used which eliminates the namespace during acceptable results filtering. https://reviews.llvm.org/D59960 Files: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm source/Expression/ExpressionSourceCode.cpp
Index: source/Expression/ExpressionSourceCode.cpp =================================================================== --- source/Expression/ExpressionSourceCode.cpp +++ source/Expression/ExpressionSourceCode.cpp @@ -168,6 +168,7 @@ ConstString var_name = var_sp->GetName(); if (!var_name || var_name == ConstString("this") || + var_name == ConstString("self") || var_name == ConstString("_cmd") || var_name == ConstString(".block_descriptor")) continue; @@ -252,7 +253,7 @@ } } - if (add_locals) { + if (add_locals) if (Language::LanguageIsCPlusPlus(frame->GetLanguage())) { if (target->GetInjectLocalVariables(&exe_ctx)) { lldb::VariableListSP var_list_sp = @@ -260,7 +261,6 @@ AddLocalVariableDecls(var_list_sp, lldb_local_var_decls); } } - } } if (m_wrap) { @@ -326,10 +326,12 @@ "@implementation $__lldb_objc_class ($__lldb_category) \n" "+(void)%s:(void *)$__lldb_arg \n" "{ \n" + " %s; \n" "%s" "} \n" "@end \n", - m_name.c_str(), m_name.c_str(), tagged_body.c_str()); + m_name.c_str(), m_name.c_str(), lldb_local_var_decls.GetData(), + tagged_body.c_str()); } else { wrap_stream.Printf( "@interface $__lldb_objc_class ($__lldb_category) \n" Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/util.mm @@ -0,0 +1,16 @@ +#import <Foundation/Foundation.h> + +namespace error { +int blah; +} + +@interface Util : NSObject ++ (void)debugPrintError; +@end + +@implementation Util ++ (void)debugPrintError { + NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:-1 userInfo:nil]; + NSLog(@"xxx, error = %@", error); // break here +} +@end Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/main.mm @@ -0,0 +1,11 @@ +#import <Foundation/Foundation.h> +@interface Util : NSObject ++ (void)debugPrintError; +@end + +int main(int argc, const char * argv[]) { + [Util debugPrintError]; + + return 0; +} + Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/TestNamespaceLocalVarSameName.py @@ -0,0 +1,19 @@ +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class TestNamespaceLocalVarSameName(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + @skipUnlessDarwin + @add_test_categories(["gmodules"]) + def test_namespace_local_var_same_name(self): + self.build() + + lldbutil.run_to_source_breakpoint(self, '// break here', + lldb.SBFileSpec("util.mm", False)) + + self.expect("expr error", + substrs=['(NSError *) $0 =']) Index: packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile =================================================================== --- /dev/null +++ packages/Python/lldbsuite/test/expression_command/namespace_local_var_same_name/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make +OBJCXX_SOURCES := main.mm util.mm +include $(LEVEL)/Makefile.rules + +LDFLAGS += -framework Foundation
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits