// RUN: %clang_cc1 -triple i686-pc-win32 -fsyntax-only -verify %s -DMS // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu-pc-win32 -fsyntax-only -verify %s template class X0 { public: void f(T t); struct Inner { void g(T t); }; }; template void X0::f(T t) { t = 17; // expected-error{{incompatible}} } extern template class X0; extern template class X0; template void X0::Inner::g(T t) { #ifdef MS t = 17; // expected-error{{incompatible integer to pointer conversion assigning to 'long *'}} expected-error{{incompatible integer to pointer conversion assigning to 'int *'}} #else t = 17; // expected-error{{incompatible integer to pointer conversion assigning to 'long *'}} #endif } void test_intptr(X0 xi, X0::Inner xii) { xi.f(0); #ifdef MS xii.g(0); // expected-note {{instantiation}} #else xii.g(0); #endif } extern template class X0; void test_longptr(X0 xl, X0::Inner xli) { xl.f(0); xli.g(0); } template class X0; // expected-note 2{{instantiation}} template class X1 { public: void f(T t) { t += 2; } void g(T t); }; template void X1::g(T t) { t += 2; } extern template class X1; void g_X1(X1 x1, void *ptr) { x1.g(ptr); } extern template void X1::g(const void*); void g_X1_2(X1 x1, const void *ptr) { x1.g(ptr); } namespace static_const_member { template struct A { static const int n; }; template const int A::n = 3; extern template struct A; int arr[A::n]; }