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