1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | // pr7029 |
3 | |
4 | template <class Key, class T> struct QMap |
5 | { |
6 | void insert(const Key &, const T &); |
7 | T v; |
8 | }; |
9 | |
10 | |
11 | template <class Key, class T> |
12 | void QMap<Key, T>::insert(const Key &, const T &avalue) |
13 | { |
14 | v = avalue; |
15 | } |
16 | |
17 | struct Rec { |
18 | union { // expected-warning-re {{variable sized type '{{.*}}' not at the end of a struct or class is a GNU extension}} |
19 | int u0[]; |
20 | }; |
21 | int x; |
22 | } rec; |
23 | |
24 | struct inotify_event |
25 | { |
26 | int wd; |
27 | |
28 | // clang doesn't like '[]': |
29 | // cannot initialize a parameter of type 'void *' with an rvalue of type 'char (*)[]' |
30 | char name []; |
31 | }; |
32 | |
33 | |
34 | void foo() |
35 | { |
36 | inotify_event event; |
37 | inotify_event* ptr = &event; |
38 | inotify_event event1 = *ptr; |
39 | *ptr = event; |
40 | QMap<int, inotify_event> eventForId; |
41 | eventForId.insert(ptr->wd, *ptr); |
42 | } |
43 | |
44 | struct S { |
45 | virtual void foo(); |
46 | }; |
47 | |
48 | struct X { |
49 | int blah; |
50 | S strings[]; |
51 | }; |
52 | |
53 | S a, b = a; |
54 | S f(X &x) { |
55 | a = b; |
56 | return x.strings[0]; |
57 | } |
58 | |
59 | class A { |
60 | int s; |
61 | char c[]; |
62 | }; |
63 | |
64 | union B { |
65 | int s; |
66 | char c[]; |
67 | }; |
68 | |
69 | class C { |
70 | char c[]; // expected-error {{flexible array member 'c' with type 'char []' is not at the end of class}} |
71 | int s; // expected-note {{next field declaration is here}} |
72 | }; |
73 | |
74 | namespace rdar9065507 { |
75 | |
76 | struct StorageBase { |
77 | long ref_count; |
78 | unsigned size; |
79 | unsigned capacity; |
80 | }; |
81 | |
82 | struct Storage : StorageBase { |
83 | int data[]; |
84 | }; |
85 | |
86 | struct VirtStorage : virtual StorageBase { |
87 | int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}} |
88 | }; |
89 | |
90 | } |
91 | |
92 | struct NonTrivDtor { ~NonTrivDtor(); }; |
93 | // FIXME: It's not clear whether we should disallow examples like this. GCC accepts. |
94 | struct FlexNonTrivDtor { |
95 | int n; |
96 | NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}} |
97 | ~FlexNonTrivDtor() { |
98 | for (int i = n; i != 0; --i) |
99 | ntd[i-1].~NonTrivDtor(); |
100 | } |
101 | }; |
102 | |