1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 // pr7029 3 4 template <class Key, class T> struct QMap 5 { 6 void insert(const Key &, const T &); 7 T v; 8 }; 9 10 11 template <class Key, class T> insert(const Key &,const T & avalue)12void QMap<Key, T>::insert(const Key &, const T &avalue) 13 { 14 v = avalue; 15 } 16 17 struct 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 24 struct 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 foo()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 44 struct S { 45 virtual void foo(); 46 }; 47 48 struct X { 49 int blah; 50 S strings[]; 51 }; 52 53 S a, b = a; f(X & x)54S f(X &x) { 55 a = b; 56 return x.strings[0]; 57 } 58 59 class A { 60 int s; 61 char c[]; 62 }; 63 64 union B { 65 int s; 66 char c[]; 67 }; 68 69 namespace rdar9065507 { 70 71 struct StorageBase { 72 long ref_count; 73 unsigned size; 74 unsigned capacity; 75 }; 76 77 struct Storage : StorageBase { 78 int data[]; 79 }; 80 81 struct 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 87 struct NonTrivDtor { ~NonTrivDtor(); }; 88 // FIXME: It's not clear whether we should disallow examples like this. GCC accepts. 89 struct FlexNonTrivDtor { 90 int n; 91 NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}} ~FlexNonTrivDtorFlexNonTrivDtor92 ~FlexNonTrivDtor() { 93 for (int i = n; i != 0; --i) 94 ntd[i-1].~NonTrivDtor(); 95 } 96 }; 97