Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix scope-based lookup when more than one function is found.
When multiple functions are found by name, lldb removes duplicate entries of functions with the same type, so the first function in the symbol context list is chosen, even if it isn't in scope. This patch uses the declaration context of the execution context to select the function which is in scope. This fixes cases like the following: int func(); namespace ns { int func(); void here() { // Run to BP here and eval 'p func()'; // lldb used to find ::func(), now finds ns::func(). } } Reviewed by: clayborg Subscribers: lldb-commits Differential Revision: http://reviews.llvm.org/D15312 llvm-svn: 255439
- Loading branch information
Dawn Perchik
committed
Dec 12, 2015
1 parent
9315392
commit b592578
Showing
9 changed files
with
417 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/Makefile
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
LEVEL = ../../../make | ||
|
||
CXX_SOURCES := main.cpp | ||
CXX_SOURCES := main.cpp ns.cpp ns2.cpp ns3.cpp | ||
|
||
include $(LEVEL)/Makefile.rules |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
32 changes: 32 additions & 0 deletions
32
lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
//===-- ns.cpp ------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "ns.h" | ||
|
||
int foo() | ||
{ | ||
printf("global foo()\n"); | ||
return 42; | ||
} | ||
int func() | ||
{ | ||
printf("global func()\n"); | ||
return 1; | ||
} | ||
int func(int a) | ||
{ | ||
printf("global func(int)\n"); | ||
return a + 1; | ||
} | ||
void test_lookup_at_global_scope() | ||
{ | ||
// BP_global_scope | ||
printf("at global scope: foo() = %d\n", foo()); // eval foo(), exp: 42 | ||
printf("at global scope: func() = %d\n", func()); // eval func(), exp: 1 | ||
} |
36 changes: 36 additions & 0 deletions
36
lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
//===-- ns.h ------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include <stdio.h> | ||
|
||
void test_lookup_at_global_scope(); | ||
void test_lookup_at_file_scope(); | ||
void test_lookup_before_using_directive(); | ||
void test_lookup_after_using_directive(); | ||
int func(int a); | ||
namespace A { | ||
int foo(); | ||
int func(int a); | ||
inline int func() | ||
{ | ||
printf("A::func()\n"); | ||
return 3; | ||
} | ||
inline int func2() | ||
{ | ||
printf("A::func2()\n"); | ||
return 3; | ||
} | ||
void test_lookup_at_ns_scope(); | ||
namespace B { | ||
int func(); | ||
void test_lookup_at_nested_ns_scope(); | ||
void test_lookup_at_nested_ns_scope_after_using(); | ||
} | ||
} |
65 changes: 65 additions & 0 deletions
65
lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
//===-- ns2.cpp ------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "ns.h" | ||
|
||
static int func() | ||
{ | ||
printf("static m2.cpp func()\n"); | ||
return 2; | ||
} | ||
void test_lookup_at_file_scope() | ||
{ | ||
// BP_file_scope | ||
printf("at file scope: func() = %d\n", func()); // eval func(), exp: 2 | ||
printf("at file scope: func(10) = %d\n", func(10)); // eval func(10), exp: 11 | ||
} | ||
namespace A { | ||
namespace B { | ||
int func() | ||
{ | ||
printf("A::B::func()\n"); | ||
return 4; | ||
} | ||
void test_lookup_at_nested_ns_scope() | ||
{ | ||
// BP_nested_ns_scope | ||
printf("at nested ns scope: func() = %d\n", func()); // eval func(), exp: 4 | ||
|
||
//printf("func(10) = %d\n", func(10)); // eval func(10), exp: 13 | ||
// NOTE: Under the rules of C++, this test would normally get an error | ||
// because A::B::func() hides A::func(), but lldb intentionally | ||
// disobeys these rules so that the intended overload can be found | ||
// by only removing duplicates if they have the same type. | ||
} | ||
void test_lookup_at_nested_ns_scope_after_using() | ||
{ | ||
// BP_nested_ns_scope_after_using | ||
using A::func; | ||
printf("at nested ns scope after using: func() = %d\n", func()); // eval func(), exp: 3 | ||
} | ||
} | ||
} | ||
int A::foo() | ||
{ | ||
printf("A::foo()\n"); | ||
return 42; | ||
} | ||
int A::func(int a) | ||
{ | ||
printf("A::func(int)\n"); | ||
return a + 3; | ||
} | ||
void A::test_lookup_at_ns_scope() | ||
{ | ||
// BP_ns_scope | ||
printf("at nested ns scope: func() = %d\n", func()); // eval func(), exp: 3 | ||
printf("at nested ns scope: func(10) = %d\n", func(10)); // eval func(10), exp: 13 | ||
printf("at nested ns scope: foo() = %d\n", foo()); // eval foo(), exp: 42 | ||
} |
27 changes: 27 additions & 0 deletions
27
lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/ns3.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
//===-- ns3.cpp ------------------------------------------------*- C++ -*-===// | ||
// | ||
// The LLVM Compiler Infrastructure | ||
// | ||
// This file is distributed under the University of Illinois Open Source | ||
// License. See LICENSE.TXT for details. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#include "ns.h" | ||
extern int func(); | ||
|
||
// Note: the following function must be before the using. | ||
void test_lookup_before_using_directive() | ||
{ | ||
// BP_before_using_directive | ||
printf("before using directive: func() = %d\n", func()); // eval func(), exp: 1 | ||
} | ||
using namespace A; | ||
void test_lookup_after_using_directive() | ||
{ | ||
// BP_after_using_directive | ||
//printf("func() = %d\n", func()); // eval func(), exp: error, amiguous | ||
printf("after using directive: func2() = %d\n", func2()); // eval func2(), exp: 3 | ||
printf("after using directive: ::func() = %d\n", ::func()); // eval ::func(), exp: 1 | ||
printf("after using directive: B::func() = %d\n", B::func()); // eval B::func(), exp: 4 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.