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