11553Srgrimes// { dg-do run { target c++11 } }
21553Srgrimes
31553Srgrimesnamespace xstd {
41553Srgrimes
51553Srgrimestypedef decltype(sizeof(char)) size_t;
61553Srgrimes
71553Srgrimestemplate<class E>
81553Srgrimesclass initializer_list {
91553Srgrimesprivate:
101553Srgrimes	size_t sz;
111553Srgrimes	const E* start;
121553Srgrimes
131553Srgrimespublic:
141553Srgrimes	typedef E value_type;
151553Srgrimes  typedef const E& reference;
161553Srgrimes  typedef const E& const_reference;
171553Srgrimes  typedef size_t size_type;
181553Srgrimes  typedef const E* iterator;
191553Srgrimes  typedef const E* const_iterator;
201553Srgrimes
211553Srgrimes  constexpr initializer_list() : sz(), start(nullptr) {}
221553Srgrimes
231553Srgrimes  template<size_t N>
241553Srgrimes  constexpr initializer_list(const E(&array)[N]) : sz(N), start(array) {}
251553Srgrimes
261553Srgrimes  constexpr size_t size() const { return sz; }
271553Srgrimes
281553Srgrimes  constexpr const E* begin() const { return start; }
291553Srgrimes
301553Srgrimes  constexpr const E* end() const { return start + sz; }
311553Srgrimes};
321553Srgrimes
331553Srgrimestemplate<class E, size_t N>
341553Srgrimesconstexpr initializer_list<E> make_list(const E(&array)[N]) {
3531492Swollman	return initializer_list<E>(array);
3615648Sjoerg}
3731492Swollman
3831492Swollmantemplate<class E>
3950479SpeterE min(initializer_list<E> list)
401553Srgrimes{
411553Srgrimes  //	static_assert(list.size() > 0, "Invalid list");
421553Srgrimes	auto it = list.begin();
431553Srgrimes	E result = *it;
441553Srgrimes	for (++it; it != list.end(); ++it) {
4531492Swollman		if (*it < result) {
4631492Swollman			result = *it;
4731492Swollman		}
4831492Swollman	}
491553Srgrimes	return result;
501553Srgrimes}
511553Srgrimes
521553Srgrimes}
5331492Swollman
5431492Swollmanconstexpr int global_i[] = {2, 4, -5, 6, 10};
5531492Swollmanconstexpr xstd::initializer_list<int> list(global_i);
5631492Swollman#define SA(X) static_assert(X, #X)
5731492SwollmanSA(list.size() == 5);
5831492SwollmanSA(list.begin()[2] == -5);
591553SrgrimesSA(list.end()[-1] == 10);
601553Srgrimes
611553Srgrimesint main() {
621553Srgrimes  if (xstd::min(xstd::make_list(global_i)) != -5)
631553Srgrimes    return 1;
641553Srgrimes}
651553Srgrimes