xref: /aosp_15_r20/external/clang/test/SemaCXX/flexible-array-test.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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 Li void 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 Li void 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 Li S 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