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