diff options
Diffstat (limited to 'test/SemaTemplate/argument-dependent-lookup.cpp')
-rw-r--r-- | test/SemaTemplate/argument-dependent-lookup.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/SemaTemplate/argument-dependent-lookup.cpp b/test/SemaTemplate/argument-dependent-lookup.cpp new file mode 100644 index 0000000000000..d1603d56b960a --- /dev/null +++ b/test/SemaTemplate/argument-dependent-lookup.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -verify %s +// RUN: %clang_cc1 -verify %s -DHAVE_UNQUALIFIED_LOOKUP_RESULTS +// expected-no-diagnostics + +namespace address_of { +#ifdef HAVE_UNQUALIFIED_LOOKUP_RESULTS + struct Q {}; + void operator&(Q); +#endif + + template<typename T> struct A { + static constexpr auto x = &T::value; + }; + + template<typename T> struct B { + constexpr int operator&() { return 123; } + }; + + template<typename T> struct C { + static_assert(sizeof(T) == 123, ""); + }; + + struct X1 { + static B<X1> value; + }; + struct X2 : B<X2> { + enum E { value }; + friend constexpr int operator&(E) { return 123; } + }; + + struct Y1 { + C<int> *value; + }; + struct Y2 { + C<int> value(); + }; + + // ok, uses ADL to find operator&: + static_assert(A<X1>::x == 123, ""); + static_assert(A<X2>::x == 123, ""); + + // ok, does not use ADL so does not instantiate C<T>: + static_assert(A<Y1>::x == &Y1::value, ""); + static_assert(A<Y2>::x == &Y2::value, ""); +} |