// RUN: %clang_cc1 -fsyntax-only -verify %s 
// pr7029

template <class Key, class T> struct QMap
{
  void insert(const Key &, const T &);
  T v;
};


template <class Key, class T>
void QMap<Key, T>::insert(const Key &, const T &avalue)
{
  v = avalue;
}

struct Rec {
  union { // expected-warning-re {{variable sized type '{{.*}}' not at the end of a struct or class is a GNU extension}}
    int u0[];
  };
  int x;
} rec;

struct inotify_event
{
  int wd;
 
  // clang doesn't like '[]': 
  // cannot initialize a parameter of type 'void *' with an rvalue of type 'char (*)[]'
  char name [];	
};


void foo()
{
    inotify_event event;
    inotify_event* ptr = &event;
    inotify_event event1 = *ptr;
    *ptr = event;
    QMap<int, inotify_event> eventForId;
    eventForId.insert(ptr->wd, *ptr);
}

struct S {
  virtual void foo();
};

struct X {
   int blah;
   S strings[];
};

S a, b = a;
S f(X &x) {
  a = b;
  return x.strings[0];
}

class A {
  int s;
  char c[];
};

union B {
  int s;
  char c[];
};

namespace rdar9065507 {

struct StorageBase {
  long ref_count;
  unsigned size;
  unsigned capacity;
};

struct Storage : StorageBase {
  int data[];
};

struct VirtStorage : virtual StorageBase {
  int data[]; // expected-error {{flexible array member 'data' not allowed in struct which has a virtual base class}}
};

}

struct NonTrivDtor { ~NonTrivDtor(); };
// FIXME: It's not clear whether we should disallow examples like this. GCC accepts.
struct FlexNonTrivDtor {
  int n;
  NonTrivDtor ntd[]; // expected-error {{flexible array member 'ntd' of type 'NonTrivDtor []' with non-trivial destruction}}
  ~FlexNonTrivDtor() {
    for (int i = n; i != 0; --i)
      ntd[i-1].~NonTrivDtor();
  }
};
