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