teak-llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
Dawn Perchik b59257841e 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
2015-12-12 19:31:41 +00:00

125 lines
2.6 KiB
C++

//===-- main.cpp ------------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <cstdarg>
#include "ns.h"
namespace {
typedef unsigned int my_uint_t;
int i; // Find the line number for anonymous namespace variable i.
int myanonfunc (int a)
{
return a + a;
}
int
variadic_sum (int arg_count...)
{
int sum = 0;
va_list args;
va_start(args, arg_count);
for (int i = 0; i < arg_count; i++)
sum += va_arg(args, int);
va_end(args);
return sum;
}
}
namespace A {
typedef unsigned int uint_t;
namespace B {
typedef unsigned int uint_t;
int j; // Find the line number for named namespace variable j.
int myfunc (int a);
int myfunc2(int a)
{
return a + 2;
}
float myfunc (float f)
{
return f - 2.0;
}
}
}
namespace Y
{
typedef unsigned int uint_t;
using A::B::j;
int foo;
}
using A::B::j; // using declaration
namespace Foo = A::B; // namespace alias
using Foo::myfunc; // using declaration
using namespace Foo; // using directive
namespace A {
namespace B {
using namespace Y;
int k;
}
}
namespace ns1 {
int value = 100;
}
namespace ns2 {
int value = 200;
}
void test_namespace_scopes() {
do {
using namespace ns1;
printf("ns1::value = %d\n", value); // Evaluate ns1::value
} while(0);
do {
using namespace ns2;
printf("ns2::value = %d\n", value); // Evaluate ns2::value
} while(0);
}
int Foo::myfunc(int a)
{
test_namespace_scopes();
::my_uint_t anon_uint = 0;
A::uint_t a_uint = 1;
B::uint_t b_uint = 2;
Y::uint_t y_uint = 3;
i = 3;
j = 4;
printf("::i=%d\n", ::i);
printf("A::B::j=%d\n", A::B::j);
printf("variadic_sum=%d\n", variadic_sum(3, 1, 2, 3));
myanonfunc(3);
return myfunc2(3) + j + i + a + 2 + anon_uint + a_uint + b_uint + y_uint; // Set break point at this line.
}
int
main (int argc, char const *argv[])
{
test_lookup_at_global_scope();
test_lookup_at_file_scope();
A::test_lookup_at_ns_scope();
A::B::test_lookup_at_nested_ns_scope();
A::B::test_lookup_at_nested_ns_scope_after_using();
test_lookup_before_using_directive();
test_lookup_after_using_directive();
return Foo::myfunc(12);
}