1 | // RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s |
2 | |
3 | struct one { char c[1]; }; |
4 | struct two { char c[2]; }; |
5 | |
6 | namespace aggregate { |
7 | struct S { |
8 | int ar[2]; |
9 | struct T { |
10 | int i1; |
11 | int i2; |
12 | } t; |
13 | struct U { |
14 | int i1; |
15 | } u[2]; |
16 | struct V { |
17 | int var[2]; |
18 | } v; |
19 | }; |
20 | |
21 | void bracing() { |
22 | S s1 = { 1, 2, 3 ,4, 5, 6, 7, 8 }; |
23 | S s2{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; |
24 | S s3{ 1, 2, 3, 4, 5, 6 }; |
25 | S s4{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; |
26 | S s5{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; |
27 | } |
28 | |
29 | void bracing_new() { |
30 | new S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; |
31 | new S{ 1, 2, 3, 4, 5, 6 }; |
32 | new S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; |
33 | new S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; |
34 | } |
35 | |
36 | void bracing_construct() { |
37 | (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, { {7, 8} } }; |
38 | (void) S{ 1, 2, 3, 4, 5, 6 }; |
39 | (void) S{ {1, 2}, {3, 4}, {5, 6}, { {7, 8} } }; |
40 | (void) S{ {1, 2}, {3, 4}, { {5}, {6} }, {7, 8} }; |
41 | } |
42 | |
43 | struct String { |
44 | String(const char*); |
45 | }; |
46 | |
47 | struct A { |
48 | int m1; |
49 | int m2; |
50 | }; |
51 | |
52 | void function_call() { |
53 | void takes_A(A); |
54 | takes_A({1, 2}); |
55 | } |
56 | |
57 | struct B { |
58 | int m1; |
59 | String m2; |
60 | }; |
61 | |
62 | void overloaded_call() { |
63 | one overloaded(A); |
64 | two overloaded(B); |
65 | |
66 | static_assert(sizeof(overloaded({1, 2})) == sizeof(one), "bad overload"); |
67 | static_assert(sizeof(overloaded({1, "two"})) == sizeof(two), |
68 | "bad overload"); |
69 | // String is not default-constructible |
70 | static_assert(sizeof(overloaded({1})) == sizeof(one), "bad overload"); |
71 | } |
72 | |
73 | struct C { int a[2]; C():a({1, 2}) { } }; // expected-error {{parenthesized initialization of a member array is a GNU extension}} |
74 | } |
75 | |
76 | namespace array_explicit_conversion { |
77 | typedef int test1[2]; |
78 | typedef int test2[]; |
79 | template<int x> struct A { int a[x]; }; // expected-error {{'a' declared as an array with a negative size}} |
80 | typedef A<1> test3[]; |
81 | typedef A<-1> test4[]; |
82 | void f() { |
83 | (void)test1{1}; |
84 | (void)test2{1}; |
85 | (void)test3{{{1}}}; |
86 | (void)test4{{{1}}}; // expected-note {{in instantiation of template class 'array_explicit_conversion::A<-1>' requested here}} |
87 | } |
88 | } |
89 | |
90 | namespace sub_constructor { |
91 | struct DefaultConstructor { // expected-note 2 {{not viable}} |
92 | DefaultConstructor(); // expected-note {{not viable}} |
93 | int x; |
94 | }; |
95 | struct NoDefaultConstructor1 { // expected-note 2 {{not viable}} |
96 | NoDefaultConstructor1(int); // expected-note {{not viable}} |
97 | int x; |
98 | }; |
99 | struct NoDefaultConstructor2 { // expected-note 4 {{not viable}} |
100 | NoDefaultConstructor2(int,int); // expected-note 2 {{not viable}} |
101 | int x; |
102 | }; |
103 | |
104 | struct Aggr { |
105 | DefaultConstructor a; |
106 | NoDefaultConstructor1 b; |
107 | NoDefaultConstructor2 c; |
108 | }; |
109 | |
110 | Aggr ok1 { {}, {0} , {0,0} }; |
111 | Aggr ok2 = { {}, {0} , {0,0} }; |
112 | Aggr too_many { {0} , {0} , {0,0} }; // expected-error {{no matching constructor for initialization}} |
113 | Aggr too_few { {} , {0} , {0} }; // expected-error {{no matching constructor for initialization}} |
114 | Aggr invalid { {} , {&ok1} , {0,0} }; // expected-error {{no matching constructor for initialization}} |
115 | NoDefaultConstructor2 array_ok[] = { {0,0} , {0,1} }; |
116 | NoDefaultConstructor2 array_error[] = { {0,0} , {0} }; // expected-error {{no matching constructor for initialization}} |
117 | } |
118 | |
119 | namespace multidimensional_array { |
120 | void g(const int (&)[2][2]) {} |
121 | void g(const int (&)[2][2][2]) = delete; |
122 | |
123 | void h() { |
124 | g({{1,2},{3,4}}); |
125 | } |
126 | } |
127 | |
128 | namespace array_addressof { |
129 | using T = int[5]; |
130 | T *p = &T{1,2,3,4,5}; // expected-error {{taking the address of a temporary object of type 'array_addressof::T' (aka 'int [5]')}} |
131 | } |
132 | |
133 | namespace PR24816 { |
134 | struct { int i; } ne = {{0, 1}}; // expected-error{{excess elements in scalar initializer}} |
135 | } |
136 | |