1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s 2f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorstruct X { 3f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor operator bool(); 4f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor}; 5f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor 6f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorint& f(bool); 7f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorfloat& f(int); 8f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor 9f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorvoid f_test(X x) { 10f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor int& i1 = f(x); 11f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor} 12f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor 13f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorstruct Y { 14f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor operator short(); 15f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor operator float(); 16f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor}; 17f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor 18f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorvoid g(int); 19f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor 20f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregorvoid g_test(Y y) { 21f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor g(y); 22cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor short s; 23cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor s = y; 24cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor} 25cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor 26cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregorstruct A { }; 27cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregorstruct B : A { }; 28cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor 29cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregorstruct C { 30cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor operator B&(); 31cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor}; 32cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor 33cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor// Test reference binding via an lvalue conversion function. 34cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregorvoid h(volatile A&); 35cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregorvoid h_test(C c) { 36cb9b977d5989efc1e5bc7684091912ca2915aacbDouglas Gregor h(c); 37f1991eab1e777634fb38758eafbbe0d303271d2fDouglas Gregor} 38734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 39734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor// Test conversion followed by copy-construction 40734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct FunkyDerived; 41734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 42734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct Base { 43734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor Base(const FunkyDerived&); 44734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor}; 45734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 46734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct Derived : Base { }; 47734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 48734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct FunkyDerived : Base { }; 49734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 50734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct ConvertibleToBase { 51734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor operator Base(); 52734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor}; 53734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 54734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct ConvertibleToDerived { 55734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor operator Derived(); 56734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor}; 57734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 58734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorstruct ConvertibleToFunkyDerived { 59734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor operator FunkyDerived(); 60734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor}; 61734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor 62734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregorvoid test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd, 63734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor ConvertibleToFunkyDerived ctfd) { 64734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor Base b1 = ctb; 65734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor Base b2(ctb); 66734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor Base b3 = ctd; 67734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor Base b4(ctd); 682b1e0039a1937e3df59b5c99bcf4746360db3441Douglas Gregor Base b5 = ctfd; 69734d9869efb5d126df53ba70a6060789887e0d68Douglas Gregor} 703fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 713fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregorstruct X1 { 720d3317e0a2e0adb57ce8d075ebdcb41a3f939805Kaelyn Uhrain X1(X1&); // expected-note{{candidate constructor not viable: expects an l-value for 1st argument}} 733fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor}; 743fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 753fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregorstruct X2 { 763fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor operator X1(); 773fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor}; 783fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 793fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregorint &f(X1); 803fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregorfloat &f(...); 813fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor 823fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregorvoid g(X2 b) { 833fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor int &ir = f(b); // expected-error{{no viable constructor copying parameter of type 'X1'}} 843fbaf3e5d524bfff219d1e3e9ac4801a8411590fDouglas Gregor} 8513e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor 8613e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregornamespace rdar10202900 { 8713e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor class A { 8813e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor public: 8913e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor A(); 9013e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor 9113e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor private: 9213e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor A(int i); // expected-note{{declared private here}} 9313e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor }; 9413e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor 9513e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor void testA(A a) { 9613e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor int b = 10; 9713e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor a = b; // expected-error{{calling a private constructor of class 'rdar10202900::A'}} 9813e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor } 9913e1bca90dc227e1e9c30900841f8bf976c0c83eDouglas Gregor} 100