• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)12 void 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()34 void 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)54 S 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 class C {
70   char c[]; // expected-error {{flexible array member 'c' with type 'char []' is not at the end of class}}
71   int s; // expected-note {{next field declaration is here}}
72 };
73 
74 namespace rdar9065507 {
75 
76 struct StorageBase {
77   long ref_count;
78   unsigned size;
79   unsigned capacity;
80 };
81 
82 struct Storage : StorageBase {
83   int data[];
84 };
85 
86 struct VirtStorage : virtual StorageBase {
87   int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}}
88 };
89 
90 }
91 
92 struct NonTrivDtor { ~NonTrivDtor(); };
93 // FIXME: It's not clear whether we should disallow examples like this. GCC accepts.
94 struct FlexNonTrivDtor {
95   int n;
96   NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}}
~FlexNonTrivDtorFlexNonTrivDtor97   ~FlexNonTrivDtor() {
98     for (int i = n; i != 0; --i)
99       ntd[i-1].~NonTrivDtor();
100   }
101 };
102