1f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 20d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 30d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregortemplate<typename T> 40d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregorstruct X0 { 50d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor struct MemberClass; 6f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 70d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor T* f0(T* ptr); 8f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 90d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor static T* static_member; 100d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor}; 110d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 12f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithtemplate class X0<int(int)>; // ok; nothing gets instantiated. 130d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 140d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregortemplate<typename T> 150d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregorstruct X0<T>::MemberClass { 160d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor T member; 170d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor}; 180d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 190d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregortemplate<typename T> 200d03514da06dffb39a260a1228ea3fd01d196fa4Douglas GregorT* X0<T>::f0(T* ptr) { 210d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor return ptr + 1; 220d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor} 230d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 240d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregortemplate<typename T> 250d03514da06dffb39a260a1228ea3fd01d196fa4Douglas GregorT* X0<T>::static_member = 0; 260d03514da06dffb39a260a1228ea3fd01d196fa4Douglas Gregor 27f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithtemplate class X0<int>; // ok 28f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 29f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 30f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithtemplate<typename T> 31f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithstruct X1 { 32f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith enum class E { 33f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith e = T::error // expected-error 2{{no members}} 34f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith }; 35f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith}; 36f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithtemplate struct X1<int>; // expected-note {{here}} 37f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 38f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithextern template struct X1<char>; // ok 39f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smith 40f1c66b40213784a1c4612f04c14cafa2b0e89988Richard Smithtemplate struct X1<char>; // expected-note {{here}} 41