| // 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, ""); |
| } |