summaryrefslogtreecommitdiff
path: root/test/SemaTemplate/argument-dependent-lookup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/SemaTemplate/argument-dependent-lookup.cpp')
-rw-r--r--test/SemaTemplate/argument-dependent-lookup.cpp45
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, "");
+}