Added tests for constrained friends. No code, we already to the right thing.
2014-08-15 Andrew Sutton <andrew.n.sut...@gmail.com> Add tests for constrained friends. * gcc/testsuite/g++.dg/concepts/friend1.C: New. * gcc/testsuite/g++.dg/concepts/friend2.C: New. Andrew
Index: gcc/testsuite/g++.dg/concepts/friend2.C =================================================================== --- gcc/testsuite/g++.dg/concepts/friend2.C (revision 0) +++ gcc/testsuite/g++.dg/concepts/friend2.C (revision 0) @@ -0,0 +1,20 @@ +// { dg-options "-std=c++1z" } + +template<typename T> + concept bool Eq() { return requires(T t) { t == t; }; } + +template<Eq T> struct Foo { }; + +template<typename T> + struct S { // { dg-error "constraint failure" } + template<Eq U> friend class Bar; + + friend class Foo<T>; + }; + +struct X { }; + +int main() { + S<int> si; // OK + S<X> sx; +} Index: gcc/testsuite/g++.dg/concepts/friend1.C =================================================================== --- gcc/testsuite/g++.dg/concepts/friend1.C (revision 0) +++ gcc/testsuite/g++.dg/concepts/friend1.C (revision 0) @@ -0,0 +1,33 @@ +// { dg-options "-std=c++1z" } + +template<typename T> + concept bool Eq() { return requires(T t) { t == t; }; } + +struct Nt { + template<Eq T> friend void f(T) { } +} nt; + +template<typename T> struct S; + +template<Eq T> + void proc(S<T>*); + +template<typename T> + struct S { + friend bool operator==(S, S) requires Eq<T>() { return true; } + + friend void proc<>(S*); // { dg-error "does not match any template declaration" } + }; + +struct X { } x; + +int main() { + f(0); // OK + f(x); // { dg-error "cannot call" } + + S<int> si; + si == si; // OK + + S<X> sx; + sx == sx; // { dg-error "no match" } +}