1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2c149412d3adfc28ce1f1c0cf6d3701f9491adaf0Eli Friedmantemplate<int i> struct x {
3c149412d3adfc28ce1f1c0cf6d3701f9491adaf0Eli Friedman  static const int j = i;
4c149412d3adfc28ce1f1c0cf6d3701f9491adaf0Eli Friedman  x<j>* y;
5c149412d3adfc28ce1f1c0cf6d3701f9491adaf0Eli Friedman};
6c149412d3adfc28ce1f1c0cf6d3701f9491adaf0Eli Friedman
7cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregortemplate<int i>
8cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorconst int x<i>::j;
9cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
10cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorint array0[x<2>::j];
11cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
12cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregortemplate<typename T>
13cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorstruct X0 {
14cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor  static const unsigned value = sizeof(T);
15cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor};
16cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
17cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregortemplate<typename T>
18cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorconst unsigned X0<T>::value;
19cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
20cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorint array1[X0<int>::value == sizeof(int)? 1 : -1];
21cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
22cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorconst unsigned& testX0() { return X0<int>::value; }
23cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
24cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorint array2[X0<int>::value == sizeof(int)? 1 : -1];
25cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
26cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregortemplate<typename T>
27cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorstruct X1 {
28cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor  static const unsigned value;
29cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor};
30cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
31cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregortemplate<typename T>
32cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregorconst unsigned X1<T>::value = sizeof(T);
33cf3293eaeb3853d12cff47e648bbe835004e929fDouglas Gregor
343e9ea0b8cd7c4691d62e385245556be5fded58a7Richard Smithint array3[X1<int>::value == sizeof(int)? 1 : -1];
35