blob: 2d74fa52452ebd128b9cd85a3c529ddee85392df [file] [log] [blame]
Fariborz Jahanian1138ba62010-05-26 20:19:07 +00001// 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
David Majnemerac0b30e2014-09-24 11:04:09 +000017struct 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;
Fariborz Jahanian1138ba62010-05-26 20:19:07 +000023
24struct 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
34void 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
44struct S {
Richard Smith6fa28ff2014-01-11 00:53:35 +000045 virtual void foo();
Fariborz Jahanian1138ba62010-05-26 20:19:07 +000046};
47
48struct X {
49 int blah;
Richard Smith6fa28ff2014-01-11 00:53:35 +000050 S strings[];
Fariborz Jahanian1138ba62010-05-26 20:19:07 +000051};
Anders Carlssonf8497742010-09-03 21:53:49 +000052
Richard Smith6fa28ff2014-01-11 00:53:35 +000053S a, b = a;
54S f(X &x) {
55 a = b;
56 return x.strings[0];
57}
58
Anders Carlssonf8497742010-09-03 21:53:49 +000059class A {
60 int s;
61 char c[];
62};
63
64union B {
65 int s;
Argyrios Kyrtzidis7e25a952011-03-07 20:04:04 +000066 char c[];
Anders Carlssonf8497742010-09-03 21:53:49 +000067};
Argyrios Kyrtzidis7e25a952011-03-07 20:04:04 +000068
69namespace rdar9065507 {
70
71struct StorageBase {
72 long ref_count;
73 unsigned size;
74 unsigned capacity;
75};
76
77struct Storage : StorageBase {
78 int data[];
79};
80
David Majnemer08cd7602013-11-02 11:19:13 +000081struct VirtStorage : virtual StorageBase {
82 int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}}
83};
84
Argyrios Kyrtzidis7e25a952011-03-07 20:04:04 +000085}
Richard Smith6fa28ff2014-01-11 00:53:35 +000086
87struct NonTrivDtor { ~NonTrivDtor(); };
88// FIXME: It's not clear whether we should disallow examples like this. GCC accepts.
89struct FlexNonTrivDtor {
90 int n;
91 NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}}
92 ~FlexNonTrivDtor() {
93 for (int i = n; i != 0; --i)
94 ntd[i-1].~NonTrivDtor();
95 }
96};