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