1 // RUN: %clang_cc1 -std=c++17 -verify -emit-llvm-only %s
2
bar(const T & t)3 template <class T> void bar(const T &t) { foo(t); }
4
5 template <class>
6 struct HasFriend {
7 template <class T>
8 friend void foo(const HasFriend<T> &m) noexcept(false);
9 };
10
11 template <class T>
foo(const HasFriend<T> & m)12 void foo(const HasFriend<T> &m) noexcept(false) {}
13
f()14 void f() {
15 HasFriend<int> x;
16 foo(x);
17 bar(x);
18 }
19
20 template<typename T> void droid();
21 struct X {
22 template<typename T> friend void ::droid();
23 template<int N> friend void ::droid(); // expected-error {{does not match}}
24 // FIXME: We should produce a note for the above candidate explaining why
25 // it's not the droid we're looking for.
26 };
27