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