* decl.c (make_typename_type): s/parameters/arguments/.
[official-gcc.git] / gcc / testsuite / g++.dg / cpp0x / linkage2.C
blob52858687ed33c6106f7562affb6852da2c5572ae
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.
7 // { dg-do compile { target c++11 } }
9 template <typename T> struct B {
10   void g(T){}
11   void h(T);                    // { dg-error "never defined" }
12   friend void i(B, T){}
13   static T t1;                  // { dg-error "never defined" }
14   static T t2;
17 template <typename T> T B<T>::t2 = { };
19 enum { E1 } e1;                 // OK, defined
20 extern enum { E2 } e2;          // { dg-error "never defined" }
21 extern "C" enum { E3 } e3;      // OK, extern "C"
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;