1 // { dg-do compile { target c++11 } }
2 // { dg-options "-fconcepts" }
3 
4 template <typename T>
foo1(T & t)5 void foo1(T& t) {
6   typename T::template C<void> tcv = t;
7   typename T::template C<auto> u = tcv;
8   T::template C<auto>::f (tcv, u); // { dg-error "incomplete" }
9   (typename T::template D<auto> (t)); // { dg-error "invalid" }
10 }
11 
12 struct T1 {
13   template <typename T> struct C {
14     C(T1&);
15     static void f(T1&, C&);
16   };
17   template <typename T> struct D {
18     D(T1&);
19   };
20 };
21 
22 template <typename T>
foo2(T & t)23 void foo2(T& t) {
24   typename T::template C<void> tcv = t;
25   typename T::template C<auto> u = tcv;
26   T::template C<auto>::f (tcv, u); // { dg-error "incomplete" }
27   T::template D<auto> (t); // { dg-error "invalid" }
28 }
29 
30 struct T2 {
31   template <typename T> struct C {
32     C(T2&);
33     static void f(T2&, C&);
34   };
35   template <typename T> static void D(T2&);
36 };
37 
f(T1 & t1,T2 & t2)38 void f(T1& t1, T2& t2) {
39   foo1 (t1);
40   foo2 (t2);
41 }
42