16503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian// RUN: %clang_cc1 -fsyntax-only -verify %s
26503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
36503fa539a8911da4e68d51499b46766335c138dFariborz Jahaniantemplate <typename T>
46503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianclass SmallVectorImpl  {
56503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianpublic:
66503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  explicit SmallVectorImpl(unsigned N) {
76503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  }
86503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
96503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  ~SmallVectorImpl() { }
106503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
116503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian};
126503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
136503fa539a8911da4e68d51499b46766335c138dFariborz Jahaniantemplate <typename T, unsigned N>
146503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianclass SmallVector : public SmallVectorImpl<T> {
156503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  typedef typename SmallVectorImpl<T>::U U; // expected-error {{no type named 'U' in 'SmallVectorImpl<CallSite>'}}
166503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  enum {
176503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
186503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian    MinUs = (static_cast<unsigned int>(sizeof(T))*N +	// expected-error {{invalid application of 'sizeof' to an incomplete type 'CallSite'}}
196503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian             static_cast<unsigned int>(sizeof(U)) - 1) /
206503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian            static_cast<unsigned int>(sizeof(U)),
216503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian    NumInlineEltsElts = MinUs
226503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  };
236503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  U InlineElts[NumInlineEltsElts];
246503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianpublic:
256503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  SmallVector() : SmallVectorImpl<T>(NumInlineEltsElts) {
266503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  }
276503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
286503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian};
296503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian
306503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianclass CallSite;	// expected-note {{forward declaration of 'CallSite'}}
316503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianclass InlineFunctionInfo {
326503fa539a8911da4e68d51499b46766335c138dFariborz Jahanianpublic:
336503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  explicit InlineFunctionInfo() {}
346503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian  SmallVector<CallSite, 2> DevirtualizedCalls;	// expected-note {{in instantiation of template class 'SmallVector<CallSite, 2>' requested}}
356503fa539a8911da4e68d51499b46766335c138dFariborz Jahanian};
36