1 // DR 743: A type without linkage shall not be used as the type of a
2 //     variable or function with linkage, unless
3 //   o the variable or function has extern "C" linkage (7.5 [dcl.link]), or
4 //   o the variable or function is not used (3.2 [basic.def.odr]) or is
5 //   defined in the same translation unit.
6 
7 // { dg-do compile { target c++11 } }
8 
9 template <typename T> struct B {
gB10   void g(T){}
11   void h(T);			// { dg-error "never defined" }
iB12   friend void i(B, T){}
13   static T t1;			// { dg-error "never defined" }
14   static T t2;
15 };
16 
17 template <typename T> T B<T>::t2 = { };
18 
19 enum { E1 } e1;			// OK, defined
20 extern enum { E2 } e2;		// { dg-error "never defined" }
21 extern "C" enum { E3 } e3;	// OK, extern "C"
22 
f()23 void f() {
24   struct A { int x; };  // no linkage
25   A a = {1};
26   B<A> ba;              // declares B<A>::g(A) and B<A>::h(A)
27   ba.t1 = a;		// error, B<T>::t never defined
28   ba.t2 = a;		// OK
29   ba.g(a);              // OK
30   ba.h(a);              // error, B<T>::h never defined
31   i(ba, a);             // OK
32   e1+e2+e3; // { dg-warning "arithmetic between different enumeration types" "" { target c++20 } }
33 }
34