The goal here is to exercise each rule in [basic.lookup.argdep] at least once. These new tests expose what I believe are 2 issues: 1. CWG 1691 needs to be implemented (p2: [...] Its associated namespaces are the innermost enclosing namespaces of its associated classes [...]) The corresponding tests are adl_class_type::X2 and adl_class_type::X5. 2. The end of paragraph 2 ([...] Additionally, if the aforementioned set of overloaded functions is named with a template-id, its associated classes and namespaces also include those of its type template-arguments and its template template-arguments.) is not implemented. Closely related, the restriction on non-dependent parameter types in this same paragraph needs to be removed. The corresponding tests are in adl_overload_set (both issues are from CWG 997). Differential Revision: https://reviews.llvm.org/D60570 Reviewed By: riccibruno, Quuxplusone llvm-svn: 358881
57 lines
1.1 KiB
C++
57 lines
1.1 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
|
|
|
// C++11 [basic.lookup.argdep]p2
|
|
//
|
|
// [...] If an associated namespace is an inline namespace (10.3.1), its
|
|
// enclosing namespace is also included in the set. If an associated
|
|
// namespace directly contains inline namespaces, those inline namespaces
|
|
// are also included in the set.
|
|
|
|
namespace test1 {
|
|
namespace L {
|
|
namespace M {
|
|
inline namespace N {
|
|
inline namespace O {
|
|
struct S {};
|
|
void f1(S);
|
|
}
|
|
void f2(S);
|
|
}
|
|
void f3(S);
|
|
}
|
|
void f4(M::S); // expected-note {{declared here}}
|
|
}
|
|
|
|
void test() {
|
|
L::M::S s;
|
|
f1(s); // ok
|
|
f2(s); // ok
|
|
f3(s); // ok
|
|
f4(s); // expected-error {{use of undeclared}}
|
|
}
|
|
}
|
|
|
|
namespace test2 {
|
|
namespace L {
|
|
struct S {};
|
|
inline namespace M {
|
|
inline namespace N {
|
|
inline namespace O {
|
|
void f1(S);
|
|
}
|
|
void f2(S);
|
|
}
|
|
void f3(S);
|
|
}
|
|
void f4(S);
|
|
}
|
|
|
|
void test() {
|
|
L::S s;
|
|
f1(s); // ok
|
|
f2(s); // ok
|
|
f3(s); // ok
|
|
f4(s); // ok
|
|
}
|
|
}
|