Files
clang-p2996/clang/test/SemaCXX/lookup-member.cpp
Richard Smith 3fb0879867 Refactor and simplify class scope name lookup.
This is partly in preparation for an upcoming change that can change the
order in which DeclContext lookup results are presented.

In passing, fix some obvious errors where name lookup's notion of a
"static member function" missed static member function templates, and
where its notion of "same set of declarations" was confused by the same
declarations appearing in a different order.
2020-11-25 16:25:33 -08:00

40 lines
1.3 KiB
C++

// RUN: %clang_cc1 -fsyntax-only -verify %s
namespace A {
class String; // expected-note {{target of using declaration}}
};
using A::String; // expected-note {{using declaration}}
class String; // expected-error {{conflicts with target of using declaration}}
// rdar://8603569
union value {
char *String;
};
namespace UnambiguousStaticMemberTemplate {
// A static member template is not ambiguous if found in multiple base class
// subobjects.
struct A { template<typename T> static void f(T); static void g(); };
struct B : A { using A::f; using A::g; };
struct C : A { using A::f; using A::g; };
struct D : B, C {};
void f(D d) { d.f(0); d.g(); }
}
namespace UnambiguousReorderedMembers {
// Static members are not ambiguous if we find them in a different order in
// multiple base classes.
struct A { static void f(); };
struct B { static void f(int); };
struct C : A, B { using A::f; using B::f; }; // expected-note {{found}}
struct D : B, A { using B::f; using A::f; };
struct E : C, D {};
void f(E e) { e.f(0); }
// But a different declaration set in different base classes does result in ambiguity.
struct X : B, A { using B::f; using A::f; static void f(int, int); }; // expected-note {{found}}
struct Y : C, X {};
void g(Y y) { y.f(0); } // expected-error {{found in multiple base classes of different types}}
}