p1-0x.cpp revision 7a614d8380297fcd2bc23986241905d97222948c
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
2
3// An aggregate is an array or a class...
4struct Aggr {
5private:
6  static const int n;
7  void f();
8protected:
9  struct Inner { int m; };
10public:
11  bool &br;
12};
13bool b;
14Aggr ag = { b };
15
16// with no user-provided constructors, ...
17struct NonAggr1a {
18  NonAggr1a(int, int);
19  int k;
20};
21// In C++03, this is {{non-aggregate type 'NonAggr1a'}}.
22// In C++0x, 'user-provided' is only defined for special member functions, so
23// this type is considered to be an aggregate. This is probably a langauge
24// defect.
25NonAggr1a na1a = { 42 };
26
27struct NonAggr1b {
28  NonAggr1b(const NonAggr1b &);
29  int k;
30};
31NonAggr1b na1b = { 42 }; // expected-error {{non-aggregate type 'NonAggr1b'}}
32
33// no brace-or-equal-initializers for non-static data members, ...
34struct NonAggr2 {
35  int m = { 123 };
36};
37NonAggr2 na2 = { 42 }; // expected-error {{non-aggregate type 'NonAggr2'}}
38
39// no private...
40struct NonAggr3 {
41private:
42  int n;
43};
44NonAggr3 na3 = { 42 }; // expected-error {{non-aggregate type 'NonAggr3'}}
45
46// or protected non-static data members, ...
47struct NonAggr4 {
48protected:
49  int n;
50};
51NonAggr4 na4 = { 42 }; // expected-error {{non-aggregate type 'NonAggr4'}}
52
53// no base classes, ...
54struct NonAggr5 : Aggr {
55};
56NonAggr5 na5 = { b }; // expected-error {{non-aggregate type 'NonAggr5'}}
57
58// and no virtual functions.
59struct NonAggr6 {
60  virtual void f();
61  int n;
62};
63NonAggr6 na6 = { 42 }; // expected-error {{non-aggregate type 'NonAggr6'}}
64