1// DR 408
2// { dg-do link }
3
4// Test that a size given in the out-of-class definition isn't used until
5// instantiation time.
6template<typename T>
7struct X
8{
9  static char s[];
10  int c;
11};
12
13template<typename T>
14char X<T>::s[sizeof(X<T>)];
15
16#define sassert(EXP) int ar[(EXP)?1:-1]
17sassert(sizeof (X<char>::s) == sizeof (int));
18
19// Test that a specialization can have a different size.
20
21template <int> void g();
22template <> void g<2>() { }
23
24template <typename T>
25struct S {
26  static int i[];
27  void f();
28};
29
30template <typename T>
31int S<T>::i[] = { 1 };
32
33template <typename T>
34void S<T>::f() {
35  g<sizeof (i) / sizeof (int)>();
36}
37
38template <>
39int S<int>::i[] = { 1, 2 };
40
41int main()
42{
43  S<int> s;
44  s.f();
45}
46