instantiate-declref.cpp revision 6569d68745c8213709740337d2be52b031384f58
1// RUN: clang-cc -fsyntax-only -verify %s
2
3namespace N {
4  struct Outer {
5    struct Inner {
6      template<typename T>
7      struct InnerTemplate {
8        struct VeryInner {
9          typedef T type;
10
11          static enum K1 { K1Val = sizeof(T) } Kind1;
12          static enum { K2Val = sizeof(T)*2 } Kind2;
13          enum { K3Val = sizeof(T)*2 } Kind3;
14
15          void foo() {
16            K1 k1 = K1Val;
17            Kind1 = K1Val;
18            Outer::Inner::InnerTemplate<type>::VeryInner::Kind2 = K2Val;
19            Kind3 = K3Val;
20          }
21
22          struct UeberInner {
23            void bar() {
24              K1 k1 = K1Val;
25              Kind1 = K1Val;
26              Outer::Inner::InnerTemplate<type>::VeryInner::Kind2 = K2Val;
27
28              InnerTemplate t;
29              InnerTemplate<type> t2;
30            }
31          };
32        };
33      };
34    };
35  };
36}
37
38typedef int INT;
39template struct N::Outer::Inner::InnerTemplate<INT>::VeryInner;
40template struct N::Outer::Inner::InnerTemplate<INT>::UeberInner; // expected-error{{'UeberInner' does not name a tag member}}
41
42namespace N2 {
43  struct Outer2 {
44    template<typename T>
45    struct Inner {
46      void foo() {
47        enum { K1Val = sizeof(T) } k1;
48        enum K2 { K2Val = sizeof(T)*2 };
49
50        K2 k2 = K2Val;
51
52        Inner i1;
53        i1.foo();
54        Inner<T> i2;
55        i2.foo();
56      }
57    };
58  };
59}
60
61// FIXME: template struct N2::Outer2::Inner<float>;
62