1 #include <vector>
2 #include <algorithm>
3 
4 using some_type = int;
5 namespace Ns {
6 using some_type = int;
7 }
8 
9 class BracedInitListBase {
10 public:
BracedInitListBase()11 BracedInitListBase()
12 	: a{int{1}},
13 	b(int(some_type(1))),
14 	c(int{some_type(1)}),
15 	d{int(some_type(1))},
16 	e{some_type{some_type{a}}}
17 {
18 }
19 
getA() const20 virtual int getA() const {
21 	return a;
22 }
23 private:
24 int a{};
25 int b{1};
26 int c = {1};
27 int d = int{1};
28 some_type e{1};
29 some_type f = {1};
30 some_type g = some_type{1};
31 std::vector<some_type> h{some_type{4}, 5};
32 ::std::vector<some_type> i = ::std::vector<some_type>{4, some_type{5}};
33 some_type j = ::std::vector<some_type>{4, some_type{5}}[1];
34 some_type k[2]{1, 2};
35 some_type l[2] = {1, 2};
36 
37 union SomeUnion {
38 int a;
39 some_type b{};
40 };
41 };
42 
43 class BracedInitListDerived : public BracedInitListBase {
44 public:
getA() const45 int getA() const override {
46 	return BracedInitListBase::getA();
47 }
48 };
49 
inc(some_type a)50 some_type inc(some_type a)
51 {
52 	return some_type{++a};
53 }
54 
sum(some_type a,some_type b=some_type{1})55 some_type sum(some_type a, some_type b = some_type{1})
56 {
57 	return a + inc(some_type{b - some_type{1}});
58 }
59 
braced_init_list_int()60 void braced_init_list_int()
61 {
62 	{
63 		int a{};
64 		int b = {};
65 		int c = int{};
66 		int d = int{int{}};
67 		int{};
68 		int{int{}};
69 	}
70 	{
71 		int a{1};
72 		int b = {1};
73 		int c = int{1};
74 		int d = int{int{1}};
75 		int{1};
76 		int{int{1}};
77 	}
78 }
79 
braced_init_list_some_type()80 void braced_init_list_some_type()
81 {
82 	{
83 		some_type a{};
84 		some_type b = {};
85 		some_type c = some_type{};
86 		some_type d = some_type{some_type{}};
87 		some_type{};
88 		some_type{some_type{}};
89 	}
90 	{
91 		some_type a{1};
92 		some_type b = {1};
93 		some_type c = some_type{1};
94 		some_type d = some_type{some_type{1}};
95 		some_type{1};
96 		some_type{some_type{1}};
97 	}
98 	{
99 		::some_type a{1};
100 		::some_type b = {1};
101 		::some_type c = ::some_type{1};
102 		::some_type d = ::some_type{::some_type{1}};
103 		::some_type{1};
104 		::some_type{::some_type{1}};
105 	}
106 	{
107 		Ns::some_type a{1};
108 		Ns::some_type b = {1};
109 		Ns::some_type c = Ns::some_type{1};
110 		Ns::some_type d = Ns::some_type{Ns::some_type{1}};
111 		Ns::some_type{1};
112 		Ns::some_type{Ns::some_type{1}};
113 	}
114 	{
115 		::Ns::some_type a{1};
116 		::Ns::some_type b = {1};
117 		::Ns::some_type c = ::Ns::some_type{1};
118 		::Ns::some_type d = ::Ns::some_type{::Ns::some_type{1}};
119 		::Ns::some_type{1};
120 		::Ns::some_type{::Ns::some_type{1}};
121 	}
122 }
123 
braced_init_list_some_type_auto()124 void braced_init_list_some_type_auto()
125 {
126 	{
127 		auto b = some_type{};
128 		auto c = some_type{some_type{}};
129 	}
130 	{
131 		auto a = {1};
132 		auto b = some_type{1};
133 		auto c = some_type{some_type{1}};
134 	}
135 	{
136 		auto b = ::some_type{1};
137 		auto c = ::some_type{::some_type{1}};
138 	}
139 	{
140 		auto b = Ns::some_type{1};
141 		auto c = Ns::some_type{Ns::some_type{1}};
142 	}
143 	{
144 		auto b = ::Ns::some_type{1};
145 		auto c = ::Ns::some_type{::Ns::some_type{1}};
146 	}
147 }
148 
braced_init_list_function_call()149 void braced_init_list_function_call()
150 {
151 	{
152 		some_type a{sum(some_type{}, some_type{})};
153 		some_type b = sum(some_type{}, some_type{});
154 		some_type c = some_type{sum(some_type{}, some_type{})};
155 		some_type{sum(some_type{}, some_type{})};
156 		some_type{some_type{sum(some_type{}, some_type{})}};
157 	}
158 	{
159 		some_type a{sum(some_type{1}, some_type{1})};
160 		some_type b = sum(some_type{1}, some_type{1});
161 		some_type c = some_type{sum(some_type{1}, some_type{1})};
162 		some_type{sum(some_type{a}, some_type{b})};
163 		some_type{some_type{sum(some_type{a}, some_type{b})}};
164 	}
165 	{
166 		::some_type a{sum(::some_type{1}, ::some_type{1})};
167 		::some_type b = sum(::some_type{1}, ::some_type{1});
168 		::some_type c = ::some_type{sum(::some_type{1}, ::some_type{1})};
169 		::some_type{sum(::some_type{a}, ::some_type{b})};
170 		::some_type{::some_type{sum(::some_type{a}, ::some_type{b})}};
171 	}
172 	{
173 		Ns::some_type a{sum(Ns::some_type{1}, Ns::some_type{1})};
174 		Ns::some_type b = sum(Ns::some_type{1}, Ns::some_type{1});
175 		Ns::some_type c = Ns::some_type{sum(Ns::some_type{1}, Ns::some_type{1})};
176 		Ns::some_type{sum(Ns::some_type{a}, Ns::some_type{b})};
177 		Ns::some_type{Ns::some_type{sum(Ns::some_type{a}, Ns::some_type{b})}};
178 	}
179 	{
180 		::Ns::some_type a{sum(::Ns::some_type{1}, ::Ns::some_type{1})};
181 		::Ns::some_type b = sum(::Ns::some_type{1}, ::Ns::some_type{1});
182 		::Ns::some_type c = ::Ns::some_type{sum(::Ns::some_type{1}, ::Ns::some_type{1})};
183 		::Ns::some_type{sum(::Ns::some_type{a}, ::Ns::some_type{b})};
184 		::Ns::some_type{::Ns::some_type{sum(::Ns::some_type{a}, ::Ns::some_type{b})}};
185 	}
186 }
187 
braced_init_list_function_call_newline()188 void braced_init_list_function_call_newline()
189 {
190 	{
191 		some_type a{
192 			sum(some_type{},
193 				some_type{}
194 				)
195 		};
196 		some_type b = sum(
197 			some_type{}, some_type{});
198 		some_type c = some_type{
199 			sum(
200 				some_type{}, some_type{})};
201 		some_type
202 		{sum
203 			 (some_type{},
204 			 some_type{}
205 			 )
206 		};
207 		some_type
208 		{some_type{sum
209 			           (some_type{}, some_type{})}};
210 	}
211 }
212 
braced_init_list_array()213 void braced_init_list_array()
214 {
215 	{
216 		some_type a[]{};
217 		some_type b[] = {};
218 		some_type c[] = {{}, {}};
219 	}
220 	{
221 		some_type a[]{1, 2};
222 		some_type b[] = {1, 2};
223 		some_type c[] = {some_type{1}, some_type{2}};
224 	}
225 }
226 
braced_init_list_template()227 void braced_init_list_template()
228 {
229 	{
230 		std::vector<some_type> a{};
231 		std::vector<some_type> b = {};
232 		std::vector<some_type> c = {{}, {}};
233 		std::vector<some_type> d = std::vector<some_type>{};
234 		std::vector<some_type> e = std::vector<some_type>{{}, {}};
235 		std::vector<some_type> f = std::vector<some_type>{some_type{}, some_type{}};
236 		std::vector<some_type>{};
237 		std::vector<some_type>{{}, {}};
238 		std::vector<some_type>{some_type{}, some_type{}};
239 	}
240 	{
241 		std::vector<some_type> a{1, 2};
242 		std::vector<some_type> b = {1, 2};
243 		std::vector<some_type> c = std::vector<some_type>{1, 2};
244 		std::vector<some_type> d = std::vector<some_type>{some_type{1}, some_type{2}};
245 		std::vector<some_type>{1, 2};
246 		std::vector<some_type>{some_type{1}, some_type{2}};
247 	}
248 }
249 
braced_init_list_lambda()250 void braced_init_list_lambda()
251 {
252 	std::vector<some_type> a{1, 2};
253 	some_type b{2};
254 
255 	auto c = []{return true;};
256 	auto d = [](){return true;};
257 
258 	std::find_if(a.begin(), a.end(), [&b](const some_type &v){return v == b;});
259 	std::find_if(a.begin(), a.end(), [](const some_type &v){some_type b{2}; return v == b;});
260 }
261