1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li 3*67e74705SXin Li template <typename T> 4*67e74705SXin Li class SmallVectorImpl { 5*67e74705SXin Li public: SmallVectorImpl(unsigned N)6*67e74705SXin Li explicit SmallVectorImpl(unsigned N) { 7*67e74705SXin Li } 8*67e74705SXin Li ~SmallVectorImpl()9*67e74705SXin Li ~SmallVectorImpl() { } 10*67e74705SXin Li 11*67e74705SXin Li }; 12*67e74705SXin Li 13*67e74705SXin Li template <typename T, unsigned N> 14*67e74705SXin Li class SmallVector : public SmallVectorImpl<T> { 15*67e74705SXin Li typedef typename SmallVectorImpl<T>::U U; // expected-error {{no type named 'U' in 'SmallVectorImpl<CallSite>'}} 16*67e74705SXin Li enum { 17*67e74705SXin Li 18*67e74705SXin Li MinUs = (static_cast<unsigned int>(sizeof(T))*N + // expected-error {{invalid application of 'sizeof' to an incomplete type 'CallSite'}} 19*67e74705SXin Li static_cast<unsigned int>(sizeof(U)) - 1) / 20*67e74705SXin Li static_cast<unsigned int>(sizeof(U)), 21*67e74705SXin Li NumInlineEltsElts = MinUs 22*67e74705SXin Li }; 23*67e74705SXin Li U InlineElts[NumInlineEltsElts]; 24*67e74705SXin Li public: SmallVector()25*67e74705SXin Li SmallVector() : SmallVectorImpl<T>(NumInlineEltsElts) { 26*67e74705SXin Li } 27*67e74705SXin Li 28*67e74705SXin Li }; 29*67e74705SXin Li 30*67e74705SXin Li class CallSite; // expected-note {{forward declaration of 'CallSite'}} 31*67e74705SXin Li class InlineFunctionInfo { 32*67e74705SXin Li public: InlineFunctionInfo()33*67e74705SXin Li explicit InlineFunctionInfo() {} 34*67e74705SXin Li SmallVector<CallSite, 2> DevirtualizedCalls; // expected-note {{in instantiation of template class 'SmallVector<CallSite, 2>' requested}} 35*67e74705SXin Li }; 36