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 | |