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