1 // RUN: %clang_cc1 -fsyntax-only -verify %s
2 
3 // Test instantiation of static data members declared out-of-line.
4 
5 template<typename T>
6 struct X {
7   static T value;
8 };
9 
10 template<typename T>
11   T X<T>::value = 17; // expected-error{{no viable conversion}}
12 
13 struct InitOkay {
14   InitOkay(int) { }
15 };
16 
17 struct CannotInit { }; // expected-note{{candidate constructor (the implicit copy constructor) not viable}}
18 
19 int &returnInt() { return X<int>::value; }
20 float &returnFloat() { return X<float>::value; }
21 
22 InitOkay &returnInitOkay() { return X<InitOkay>::value; }
23 
24 unsigned long sizeOkay() { return sizeof(X<CannotInit>::value); }
25 
26 CannotInit &returnError() {
27   return X<CannotInit>::value; // expected-note{{instantiation}}
28 }
29