1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s 2*67e74705SXin Li x(A x)3*67e74705SXin Litemplate <class A> int x(A x) { return x++; } y()4*67e74705SXin Liint y() { return x<int>(1); } 5*67e74705SXin Li 6*67e74705SXin Li namespace PR5880 { 7*67e74705SXin Li template<typename T> 8*67e74705SXin Li struct A { 9*67e74705SXin Li static const int a = __builtin_offsetof(T, a.array[5].m); // expected-error{{no member named 'a' in 'HasM'}} 10*67e74705SXin Li }; 11*67e74705SXin Li struct HasM { 12*67e74705SXin Li float m; 13*67e74705SXin Li }; 14*67e74705SXin Li 15*67e74705SXin Li struct ArrayOfHasM { 16*67e74705SXin Li HasM array[10]; 17*67e74705SXin Li }; 18*67e74705SXin Li 19*67e74705SXin Li struct B { ArrayOfHasM a; }; 20*67e74705SXin Li A<B> x; 21*67e74705SXin Li A<HasM> x2; // expected-note{{in instantiation of}} 22*67e74705SXin Li 23*67e74705SXin Li template<typename T> 24*67e74705SXin Li struct AnonymousUnion { 25*67e74705SXin Li union { 26*67e74705SXin Li int i; 27*67e74705SXin Li float f; 28*67e74705SXin Li }; 29*67e74705SXin Li }; 30*67e74705SXin Li 31*67e74705SXin Li template<typename T> test_anon_union()32*67e74705SXin Li void test_anon_union() { 33*67e74705SXin Li int array1[__builtin_offsetof(AnonymousUnion<T>, f) == 0? 1 : -1]; 34*67e74705SXin Li int array2[__builtin_offsetof(AnonymousUnion<int>, f) == 0? 1 : -1]; 35*67e74705SXin Li } 36*67e74705SXin Li 37*67e74705SXin Li template void test_anon_union<int>(); 38*67e74705SXin Li } 39*67e74705SXin Li 40*67e74705SXin Li namespace AddrOfClassMember { 41*67e74705SXin Li template <typename T> struct S { 42*67e74705SXin Li int n; fAddrOfClassMember::S43*67e74705SXin Li static void f() { 44*67e74705SXin Li +T::n; // expected-error {{invalid use of member}} 45*67e74705SXin Li } 46*67e74705SXin Li }; g()47*67e74705SXin Li void g() { S<S<int> >::f(); } // expected-note {{in instantiation of}} 48*67e74705SXin Li } 49