// { dg-do run } // Copyright (C) 2000 Free Software Foundation, Inc. // Contributed by Nathan Sidwell 14 Nov 2000 <nathan@codesourcery.com> // Bug 635. We failed to emit initializer code for out-of-class defined // static const members of template instantiations. static int inited = 0; static bool setFlag() { inited++; return true; } template<typename T> struct X { static const bool cflag; static bool flag; static const bool iflag = true; static const bool jflag = true; }; template<typename T> const bool X<T>::cflag (setFlag ()); template<typename T> bool X<T>::flag (setFlag ()); template<typename T> const bool X<T>::iflag; int main () { X<int> a; if (!a.flag) return 1; if (!a.cflag) return 2; if (!a.iflag) return 3; if (!a.jflag) return 5; if (!X<float>::flag) return 5; if (!X<float>::cflag) return 6; if (!X<float>::iflag) return 7; if (!X<float>::jflag) return 8; if (inited != 4) return 9; return 0; } // On platforms that do not have weak symbols, these static data // members must be explicitly instantiated. The iflag and jflag data // members should not have to be explicitly instantiated because their // const-ness should allow the compiler to elide references to the // actual variables. template const bool X<int>::cflag; template bool X<int>::flag; template const bool X<float>::cflag; template bool X<float>::flag;