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