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