1// { dg-do run  }
2
3// Copyright (C) 2000 Free Software Foundation, Inc.
4// Contributed by Nathan Sidwell 14 Nov 2000 <nathan@codesourcery.com>
5
6// Bug 635. We failed to emit initializer code for out-of-class defined
7// static const members of template instantiations.
8
9static int inited = 0;
10
11static bool setFlag()
12{
13  inited++;
14  return true;
15}
16
17template<typename T> struct X
18{
19  static const bool cflag;
20  static bool flag;
21  static const bool iflag = true;
22  static const bool jflag = true;
23};
24
25template<typename T> const bool X<T>::cflag (setFlag ());
26template<typename T> bool X<T>::flag (setFlag ());
27template<typename T> const bool X<T>::iflag;
28
29int main ()
30{
31  X<int> a;
32  if (!a.flag)
33    return 1;
34  if (!a.cflag)
35    return 2;
36  if (!a.iflag)
37    return 3;
38  if (!a.jflag)
39    return 5;
40  if (!X<float>::flag)
41    return 5;
42  if (!X<float>::cflag)
43    return 6;
44  if (!X<float>::iflag)
45    return 7;
46  if (!X<float>::jflag)
47    return 8;
48  if (inited != 4)
49    return 9;
50  return 0;
51}
52
53// On platforms that do not have weak symbols, these static data
54// members must be explicitly instantiated.  The iflag and jflag data
55// members should not have to be explicitly instantiated because their
56// const-ness should allow the compiler to elide references to the
57// actual variables.
58template const bool X<int>::cflag;
59template bool X<int>::flag;
60template const bool X<float>::cflag;
61template bool X<float>::flag;
62