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 17struct 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; 23 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 { 45 virtual void foo(); 46}; 47 48struct X { 49 int blah; 50 S strings[]; 51}; 52 53S a, b = a; 54S f(X &x) { 55 a = b; 56 return x.strings[0]; 57} 58 59class A { 60 int s; 61 char c[]; 62}; 63 64union B { 65 int s; 66 char c[]; 67}; 68 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 81struct VirtStorage : virtual StorageBase { 82 int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}} 83}; 84 85} 86 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}; 97