// RUN: %clang_cc1 -std=c++0x -fsyntax-only -verify %s struct one { char c[1]; }; struct two { char c[2]; }; namespace objects { struct X1 { X1(int); }; struct X2 { explicit X2(int); }; // expected-note 2 {{candidate constructor}} template struct A { A() { static_assert(N == 0, ""); } A(int, double) { static_assert(N == 1, ""); } }; template struct E { E(int, int) { static_assert(N == 0, ""); } E(X1, int) { static_assert(N == 1, ""); } }; void overload_resolution() { { A<0> a{}; } { A<0> a = {}; } { A<1> a{1, 1.0}; } { A<1> a = {1, 1.0}; } { E<0> e{1, 2}; } } void explicit_implicit() { { X1 x{0}; } { X1 x = {0}; } { X2 x{0}; } { X2 x = {0}; } // expected-error {{no matching constructor}} } struct C { C(); C(int, double); C(int, int); int operator[](C); }; C function_call() { void takes_C(C); takes_C({1, 1.0}); C c; c[{1, 1.0}]; return {1, 1.0}; } void inline_init() { (void) C{1, 1.0}; (void) new C{1, 1.0}; } struct B { // expected-note 2 {{candidate constructor}} B(C, int, C); // expected-note {{candidate constructor not viable: cannot convert initializer list argument to 'objects::C'}} }; void nested_init() { B b1{{1, 1.0}, 2, {3, 4}}; B b2{{1, 1.0, 4}, 2, {3, 4}}; // expected-error {{no matching constructor for initialization of 'objects::B'}} } void overloaded_call() { one ov1(B); // expected-note {{not viable: cannot convert initializer list}} two ov1(C); // expected-note {{not viable: cannot convert initializer list}} static_assert(sizeof(ov1({})) == sizeof(two), "bad overload"); static_assert(sizeof(ov1({1, 2})) == sizeof(two), "bad overload"); static_assert(sizeof(ov1({{1, 1.0}, 2, {3, 4}})) == sizeof(one), "bad overload"); ov1({1}); // expected-error {{no matching function}} } }