// RUN: %clang_cc1 -std=c++20 -verify %s // RUN: %clang_cc1 -std=c++17 -verify %s namespace One { char (&b(int(&&)[1]))[1]; // #1 expected-note{{too many initializers}} char (&b(int(&&)[2]))[2]; // #2 expected-note{{too many initializers}} void f() { static_assert(sizeof(b({1})) == 1); // #1 static_assert(sizeof(b({1, 2})) == 2); // #2 b({1, 2, 3}); // expected-error{{no matching function}} } } // namespace One namespace Two { struct Bob { Bob(int = 1); }; char (&b(Bob(&&)[1]))[1]; // #1 char (&b(Bob(&&)[2]))[2]; // #2 void f() { static_assert(sizeof(b({})) == 1); // #1 static_assert(sizeof(b({Bob()})) == 1); // #1 static_assert(sizeof(b({2, Bob()})) == 2); // #2 } } // namespace Two namespace Three { struct Kevin { Kevin(int); }; char (&b(Kevin(&&)[2]))[2]; // #2 expected-note{{too few initializers}} void f() { b({2}); // #1 expected-error{{no matching function}} } } // namespace Three namespace Four { char (&b(int(&&)[1], float))[1]; // #1 expected-note{{candidate}} char (&b(int(&&)[1], double))[2]; // #2 expected-note{{candidate}} char (&c(float, int(&&)[1]))[1]; // #1 expected-note{{candidate}} char (&c(double, int(&&)[1]))[2]; // #2 expected-note{{candidate}} void f() { b({1}, 0); // expected-error{{is ambiguous}} c(0, {1}); // expected-error{{is ambiguous}} } } // namespace Four typedef decltype(sizeof(char)) size_t; namespace std { // sufficient initializer list template class initializer_list { const _E *__begin_; size_t __size_; constexpr 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_; } constexpr const _E *begin() const { return __begin_; } constexpr const _E *end() const { return __begin_ + __size_; } }; } // namespace std namespace Five { struct ugly { ugly(char *); ugly(int); }; char (&f(std::initializer_list))[1]; // #1 char (&f(std::initializer_list))[2]; // #2 void g() { // Pick #2 as #1 not viable (3->char * fails). static_assert(sizeof(f({"hello", 3})) == 2); // expected-warning{{not allow}} } } // namespace Five