void missing_initializerlist() {
auto l = {1, 2, 3, 4}; }
namespace std {
typedef decltype(sizeof(int)) size_t;
template <class _E>
class initializer_list
{
const _E* __begin_;
size_t __size_;
initializer_list(const _E* __b, size_t __s)
: __begin_(__b),
__size_(__s)
{}
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
constexpr initializer_list() : __begin_(nullptr), __size_(0) {}
constexpr size_t size() const {return __size_;}
const _E* begin() const {return __begin_;}
const _E* end() const {return __begin_ + __size_;}
};
}
template <typename T, typename U>
struct same_type { static const bool value = false; };
template <typename T>
struct same_type<T, T> { static const bool value = true; };
struct one { char c[1]; };
struct two { char c[2]; };
struct A {
int a, b;
};
struct B {
B();
B(int, int);
};
void simple_list() {
std::initializer_list<int> il = { 1, 2, 3 };
std::initializer_list<double> dl = { 1.0, 2.0, 3 };
std::initializer_list<A> al = { {1, 2}, {2, 3}, {3, 4} };
std::initializer_list<B> bl = { {1, 2}, {2, 3}, {} };
}
void function_call() {
void f(std::initializer_list<int>);
f({1, 2, 3});
void g(std::initializer_list<B>);
g({ {1, 2}, {2, 3}, {} });
}
struct C {
C(int);
};
struct D {
D();
operator int();
operator C();
};
void overloaded_call() {
one overloaded(std::initializer_list<int>);
two overloaded(std::initializer_list<B>);
static_assert(sizeof(overloaded({1, 2, 3})) == sizeof(one), "bad overload");
static_assert(sizeof(overloaded({ {1, 2}, {2, 3}, {} })) == sizeof(two), "bad overload");
void ambiguous(std::initializer_list<A>); void ambiguous(std::initializer_list<B>); ambiguous({ {1, 2}, {2, 3}, {3, 4} });
one ov2(std::initializer_list<int>); two ov2(std::initializer_list<C>); static_assert(sizeof(ov2({1, 2, 3})) == sizeof(one), "bad overload");
ov2({1, 2, D()}); }
template <typename T>
T deduce(std::initializer_list<T>); template <typename T>
T deduce_ref(const std::initializer_list<T>&);
template<typename T, typename U> struct pair { pair(...); };
template<typename T> void deduce_pairs(std::initializer_list<pair<T, typename T::type>>);
struct WithIntType { typedef int type; };
template<typename ...T> void deduce_after_init_list_in_pack(void (*)(T...), T...);
void argument_deduction() {
static_assert(same_type<decltype(deduce({1, 2, 3})), int>::value, "bad deduction");
static_assert(same_type<decltype(deduce({1.0, 2.0, 3.0})), double>::value, "bad deduction");
deduce({1, 2.0});
static_assert(same_type<decltype(deduce_ref({1, 2, 3})), int>::value, "bad deduction");
static_assert(same_type<decltype(deduce_ref({1.0, 2.0, 3.0})), double>::value, "bad deduction");
deduce_ref({1, 2.0});
pair<WithIntType, int> pi;
pair<WithIntType, float> pf;
deduce_pairs({pi, pi, pi}); deduce_pairs({pi, pf, pi});
deduce_after_init_list_in_pack((void(*)(int,int))0, {}, 0);
deduce_after_init_list_in_pack((void(*)(int,int))0, {}, 0.0); }
void auto_deduction() {
auto l = {1, 2, 3, 4};
auto l2 {1, 2, 3, 4}; auto l3 {1};
static_assert(same_type<decltype(l), std::initializer_list<int>>::value, "");
static_assert(same_type<decltype(l3), int>::value, "");
auto bl = {1, 2.0};
void f1(int), f1(float), f2(int), f3(float);
auto fil = {f1, f2};
auto ffl = {f1, f3};
auto fl = {f1, f2, f3};
for (int i : {1, 2, 3, 4}) {}
for (int j : {1.0, 2.0, 3.0f, 4.0}) {} }
void dangle() {
new auto{1, 2, 3}; new std::initializer_list<int>{1, 2, 3}; }
struct haslist1 {
std::initializer_list<int> il = {1, 2, 3}; std::initializer_list<int> jl{1, 2, 3}; haslist1();
};
haslist1::haslist1() : il{1, 2, 3} {}
namespace PR12119 {
template<typename T> void f(std::initializer_list<T>);
template<typename T> void g(std::initializer_list<std::initializer_list<T>>);
void foo() {
f({0, {1}}); g({{0, 1}, {2, 3}});
std::initializer_list<int> il = {1, 2};
g({il, {2, 3}});
}
}
namespace Decay {
template<typename T>
void f(std::initializer_list<T>) {
T x = 1; }
void g() {
f({"A", "BB", "CCC"});
auto x = { "A", "BB", "CCC" };
std::initializer_list<const char *> *il = &x;
for( auto s : {"A", "BB", "CCC", "DDD"}) { }
}
}
namespace PR12436 {
struct X {
template<typename T>
X(std::initializer_list<int>, T);
};
X x({}, 17);
}
namespace rdar11948732 {
template<typename T> struct X {};
struct XCtorInit {
XCtorInit(std::initializer_list<X<int>>);
};
void f(X<int> &xi) {
XCtorInit xc = { xi, xi };
}
}
namespace PR14272 {
auto x { { 0, 0 } }; }
namespace initlist_of_array {
void f(std::initializer_list<int[2]>) {}
void f(std::initializer_list<int[2][2]>) = delete;
void h() {
f({{1,2},{3,4}});
}
}
namespace init_list_deduction_failure {
void f();
void f(int);
template<typename T> void g(std::initializer_list<T>);
void h() {
g({f}); g({f, h}); }
}
namespace deleted_copy {
struct X {
X(int i) {}
X(const X& x) = delete; void operator=(const X& x) = delete;
};
std::initializer_list<X> x{1}; }
namespace RefVersusInitList {
struct S {};
void f(const S &) = delete;
void f(std::initializer_list<S>);
void g(S s) { f({S()}); }
}
namespace PR18013 {
int f();
std::initializer_list<long (*)()> x = {f}; }
namespace DR1070 {
struct S {
S(std::initializer_list<int>);
};
S s[3] = { {1, 2, 3}, {4, 5} }; S *p = new S[3] { {1, 2, 3}, {4, 5} }; }
namespace ListInitInstantiate {
struct A {
A(std::initializer_list<A>);
A(std::initializer_list<int>);
};
struct B : A {
B(int);
};
template<typename T> struct X {
X();
A a;
};
template<typename T> X<T>::X() : a{B{0}, B{1}} {}
X<int> x;
int f(const A&);
template<typename T> void g() { int k = f({0}); }
template void g<int>();
}
namespace TemporaryInitListSourceRange_PR22367 {
struct A {
constexpr A() {}
A(std::initializer_list<int>); };
constexpr int f(A) { return 0; }
constexpr int k = f( std::initializer_list <int>
{0}
);
}
namespace ParameterPackNestedInitializerLists_PR23904c3 {
template <typename ...T>
void f(std::initializer_list<std::initializer_list<T>> ...tt);
void foo() {
f({{0}}, {{'\0'}}); f({{0}, {'\0'}}); f({{0, '\0'}});
f({{0}}, {{{}}}); f({{0}}, {{{}, '\0'}}); f({{0}, {{}}}); f({{0, {}}}); }
}
namespace update_rbrace_loc_crash {
template <typename T, T>
struct A {};
template <typename T, typename F, int... I>
std::initializer_list<T> ExplodeImpl(F p1, A<int, I...>) {
return {p1(I)...};
}
template <typename T, int N, typename F>
void Explode(F p1) {
ExplodeImpl<T>(p1, A<int, N>());
}
class Incomplete;
struct ContainsIncomplete {
const Incomplete &obstacle;
};
void f() {
Explode<ContainsIncomplete, 4>([](int) {});
}
}
namespace no_conversion_after_auto_list_deduction {
struct X { using T = std::initializer_list<X> X::*; operator T(); };
auto X::*x = { X() };
struct Y { using T = std::initializer_list<Y>(*)(); operator T(); };
auto (*y)() = { Y() }; }
namespace designated_init {
constexpr auto a = {.a = 1, .b = 2}; constexpr auto b = {[0] = 1, [4] = 2}; constexpr auto c = {1, [4] = 2}; constexpr auto d = {1, [0] = 2};
static_assert(c.size() == 5, "");
static_assert(d.size() == 1, "");
}
namespace weird_initlist {
struct weird {};
}
template<> struct std::initializer_list<weird_initlist::weird> { int a, b, c; };
namespace weird_initlist {
auto x = {weird{}, weird{}, weird{}, weird{}, weird{}};
constexpr auto y = {weird{}, weird{}, weird{}, weird{}, weird{}}; }
auto v = std::initializer_list<int>{1,2,3};
std::initializer_list<int> get(int cond) {
if (cond == 0)
return {};
if (cond == 1)
return {1, 2, 3}; return std::initializer_list<int>{1, 2, 3}; }