teak-llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.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

66 lines
2.0 KiB
C++

//===-- 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
}