14142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian// RUN: %clang_cc1 -fsyntax-only -verify %s
24142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian// pr7029
34142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
44142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahaniantemplate <class Key, class T> struct QMap
54142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian{
64142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  void insert(const Key &, const T &);
74142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  T v;
84142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian};
94142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
104142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
114142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahaniantemplate <class Key, class T>
124142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanianvoid QMap<Key, T>::insert(const Key &, const T &avalue)
134142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian{
144142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  v = avalue;
154142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian}
164142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
174142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
184142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanianstruct inotify_event
194142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian{
204142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  int wd;
214142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
224142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  // clang doesn't like '[]':
234142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  // cannot initialize a parameter of type 'void *' with an rvalue of type 'char (*)[]'
244142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian  char name [];
254142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian};
264142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
274142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
284142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanianvoid foo()
294142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian{
304142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    inotify_event event;
314142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    inotify_event* ptr = &event;
324142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    inotify_event event1 = *ptr;
334142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    *ptr = event;
344142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    QMap<int, inotify_event> eventForId;
354142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian    eventForId.insert(ptr->wd, *ptr);
364142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian}
374142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
384142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanianstruct S {
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual void foo();
404142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian};
414142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian
424142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanianstruct X {
434142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian   int blah;
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   S strings[];
454142cebf70fe6c3855570c98b8042431797a65fdFariborz Jahanian};
46e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson
47651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesS a, b = a;
48651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesS f(X &x) {
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  a = b;
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return x.strings[0];
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
53e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlssonclass A {
54e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson  int s;
55e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson  char c[];
56e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson};
57e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson
58e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlssonunion B {
59e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson  int s;
60d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis  char c[];
61d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis};
62d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis
63d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidisnamespace rdar9065507 {
64d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis
65d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidisstruct StorageBase {
66d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis  long ref_count;
67d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis  unsigned size;
68d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis  unsigned capacity;
69e63438b34b075a65849b9dee022adffc7c222ae5Anders Carlsson};
70d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis
71d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidisstruct Storage : StorageBase {
72d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis  int data[];
73d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis};
74d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis
753a665576c16c353d8f524189d695e3c9140eefb8David Majnemerstruct VirtStorage : virtual StorageBase {
763a665576c16c353d8f524189d695e3c9140eefb8David Majnemer  int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}}
773a665576c16c353d8f524189d695e3c9140eefb8David Majnemer};
783a665576c16c353d8f524189d695e3c9140eefb8David Majnemer
79d97cec3deb6e34f0f9d4f5f8ec11b28e44812727Argyrios Kyrtzidis}
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct NonTrivDtor { ~NonTrivDtor(); };
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// FIXME: It's not clear whether we should disallow examples like this. GCC accepts.
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct FlexNonTrivDtor {
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int n;
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}}
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ~FlexNonTrivDtor() {
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (int i = n; i != 0; --i)
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ntd[i-1].~NonTrivDtor();
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
91