1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify -pedantic %s
269d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
35f31f0893d75203c326ddcd9808099bbfe34aec0David Blaikie// Test the c++0x-specific reference initialization rules, e.g., the
469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor// rules for rvalue references.
569d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregortemplate<typename T> T prvalue();
669d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregortemplate<typename T> T&& xvalue();
769d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregortemplate<typename T> T& lvalue();
869d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
969d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregorstruct Base { };
1069d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregorstruct Derived : Base { };
1169d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
1269d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregorstruct HasArray {
1369d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  int array[5];
1469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor};
1569d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
1669d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregorint f(int);
1769d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
1835e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregortemplate<typename T>
1935e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregorstruct ConvertsTo {
20203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  operator T(); // expected-note 2{{candidate function}}
2135e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor};
2235e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor
2369d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregorvoid test_rvalue_refs() {
2469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  // If the initializer expression...
2569d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  //   - is an xvalue, class prvalue, array prvalue or function lvalue
2669d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  //     and "cv1 T1" is reference-compatible with "cv2 T2", or
2769d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
2869d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  // xvalue case
2969d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  Base&& base0 = xvalue<Base>();
3069d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  Base&& base1 = xvalue<Derived>();
3169d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  int&& int0 = xvalue<int>();
3269d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
3369d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  // class prvalue case
3469d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  Base&& base2 = prvalue<Base>();
3569d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  Base&& base3 = prvalue<Derived>();
3669d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
37c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  // array prvalue case
38c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  int (&&array0)[5] = HasArray().array;
3969d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor
4069d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  // function lvalue case
4169d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor  int (&&function0)(int) = f;
4235e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor
4335e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  //   - has a class type (i.e., T2 is a class type), where T1 is not
4435e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  //     reference-related to T2, and can be implicitly converted to
4535e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  //     an xvalue, class prvalue, or function lvalue of type "cv3
4635e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  //     T3", where "cv1 T1" is reference-compatible with "cv3 T3",
4735e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor
4835e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  // xvalue
4935e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  Base&& base4 = ConvertsTo<Base&&>();
5035e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  Base&& base5 = ConvertsTo<Derived&&>();
5135e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  int && int1 = ConvertsTo<int&&>();
5235e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor
5335e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  // class prvalue
5435e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  Base&& base6 = ConvertsTo<Base>();
5535e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  Base&& base7 = ConvertsTo<Derived>();
56564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor
57564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor  // function lvalue
58564cb06b1f010ab3c5e316ac79ba6cfdd72e9c1dDouglas Gregor  int (&&function1)(int) = ConvertsTo<int(&)(int)>();
59b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor
60b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  // In the second case, if the reference is an rvalue reference and
61b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  // the second standard conversion sequence of the user-defined
62b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  // conversion sequence includes an lvalue-to-rvalue conversion, the
63b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  // program is ill-formed.
64b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  int &&int2 = ConvertsTo<int&>(); // expected-error{{no viable conversion from 'ConvertsTo<int &>' to 'int'}}
65b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  int &&int3 = ConvertsTo<float&>(); // expected-error{{no viable conversion from 'ConvertsTo<float &>' to 'int'}}
6669d831645f429d3b806d2ae220aee45ca44f8c6cDouglas Gregor}
67c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor
68c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregorclass NonCopyable {
69c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyable(const NonCopyable&);
70c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor};
71c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor
72c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregorclass NonCopyableDerived : public NonCopyable {
73c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyableDerived(const NonCopyableDerived&);
74c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor};
75c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor
7635e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor// Make sure we get direct bindings with no copies.
77c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregorvoid test_direct_binding() {
78c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyable &&nc0 = prvalue<NonCopyable>();
79c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyable &&nc1 = prvalue<NonCopyableDerived>();
80c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyable &&nc2 = xvalue<NonCopyable>();
81c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  NonCopyable &&nc3 = xvalue<NonCopyableDerived>();
82c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  const NonCopyable &nc4 = prvalue<NonCopyable>();
83c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  const NonCopyable &nc5 = prvalue<NonCopyableDerived>();
84c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  const NonCopyable &nc6 = xvalue<NonCopyable>();
85c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor  const NonCopyable &nc7 = xvalue<NonCopyableDerived>();
8635e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  NonCopyable &&nc8 = ConvertsTo<NonCopyable&&>();
8735e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  NonCopyable &&nc9 = ConvertsTo<NonCopyableDerived&&>();
8835e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  const NonCopyable &nc10 = ConvertsTo<NonCopyable&&>();
8935e99fa40f1245cc554d8a26373e0486eb9c28f2Douglas Gregor  const NonCopyable &nc11 = ConvertsTo<NonCopyableDerived&&>();
90c5db24dfbc860a9fd1501c72f398bf6b6d5b6e0eDouglas Gregor}
91b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor
9200d66cce52cf027eac77591a9847f87dacf36995Douglas Gregornamespace std_example_1 {
9300d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double d = 2.0;
9400d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double& rd = d;
9500d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  const double& rcd = d;
9600d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  struct A { };
9700d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  struct B : A {
9800d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor    operator int&();
9900d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  } b;
10000d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  A& ra = b;
10100d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  const A& rca = b;
10200d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  int& ir = B();
10300d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor}
10400d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor
10500d66cce52cf027eac77591a9847f87dacf36995Douglas Gregornamespace std_example_2 {
10600d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double& rd2 = 2.0; // expected-error{{non-const lvalue reference to type 'double' cannot bind to a temporary of type 'double'}}
10700d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  int i = 2;
10800d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double& rd3 = i; // expected-error{{non-const lvalue reference to type 'double' cannot bind to a value of unrelated type 'int'}}
109b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  struct A { };
110b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  struct B : A { } b;
111b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  extern B f();
112b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  const A& rca = f();
113b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  A&& rra = f();
114b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  struct X {
115b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor    operator B();  // expected-note{{candidate function}}
116b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor    operator int&(); // expected-note{{candidate function}}
117b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  } x;
118b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  const A& r = x;
119b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  int&& rri = static_cast<int&&>(i);
120b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor  B&& rrb = x;
12100d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  int&& rri2 = X(); // expected-error{{no viable conversion from 'std_example_2::X' to 'int'}}
12200d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor
12300d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  const double& rcd2 = 2;
12400d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double&& rrd = 2;
12500d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  const volatile int cvi = 1;
12600d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  const int& r2 = cvi; // expected-error{{binding of reference to type 'const int' to a value of type 'const volatile int' drops qualifiers}}
12700d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor
12800d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double d;
12900d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double&& rrd2 = d; // expected-error{{rvalue reference to type 'double' cannot bind to lvalue of type 'double'}}
13000d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor  double&& rrd3 = i;
131b2855ad68d93824faf47c09bbef90ba74157f0f4Douglas Gregor}
13200d66cce52cf027eac77591a9847f87dacf36995Douglas Gregor
1338dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregornamespace argument_passing {
1348dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor  void base_rvalue_ref(Base&&);
135203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  void int_rvalue_ref(int&&); // expected-note{{candidate function not viable: no known conversion from 'ConvertsTo<int &>' to 'int &&' for 1st argument}} \
136203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  // expected-note{{candidate function not viable: no known conversion from 'ConvertsTo<float &>' to 'int &&' for 1st argument}}
137203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor
1388dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor  void array_rvalue_ref(int (&&)[5]);
1398dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor  void function_rvalue_ref(int (&&)(int));
1408dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1418dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor  void test() {
1428dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(xvalue<Base>());
1438dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(xvalue<Derived>());
1448dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    int_rvalue_ref(xvalue<int>());
1458dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1468dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(prvalue<Base>());
1478dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(prvalue<Derived>());
1488dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1498dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    array_rvalue_ref(HasArray().array);
1508dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1518dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    function_rvalue_ref(f);
1528dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1538dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(ConvertsTo<Base&&>());
1548dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(ConvertsTo<Derived&&>());
1558dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    int_rvalue_ref(ConvertsTo<int&&>());
1568dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1578dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(ConvertsTo<Base>());
1588dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    base_rvalue_ref(ConvertsTo<Derived>());
1598dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1608dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor    function_rvalue_ref(ConvertsTo<int(&)(int)>());
1618dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
162203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor    int_rvalue_ref(ConvertsTo<int&>()); // expected-error{{no matching function for call to 'int_rvalue_ref'}}
163203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor    int_rvalue_ref(ConvertsTo<float&>()); // expected-error{{no matching function for call to 'int_rvalue_ref'}}
1648dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor  }
1658dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor
1668dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregor}
167f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor
168f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregornamespace pr10644 {
169f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  struct string {
170f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor    string(const char* __s);
171f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  };
172f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  class map {
173f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor    int& operator[](const string& __k);
174f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  public:
175f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor    int& operator[](const string&& __k);
176f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  };
177f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  void foo() {
178f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor    static map key_map;
179f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor    key_map["line"];
180f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor  }
181f20d27288c7f124dcc9c50c7c6bf766d522ceb31Douglas Gregor}
182203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor
183203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregornamespace PR11003 {
184203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  class Value {
185203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  };
186203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  struct MoveRef {
187203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor    operator Value &() const ;
188203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  };
189203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  MoveRef Move(int);
190203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  void growTo() {
191203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor    Value x = Move(0);
192203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor    Value y(Move(0));
193203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor  }
194203050c2d5413c3f7e18dfa39451bf6f954136caDouglas Gregor}
195defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor
196defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregornamespace rdar13278115 {
197defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor  struct X { };
198defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor  struct Y : X { };
199defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor  X &&f0(X &x) { return x; } // expected-error{{rvalue reference to type 'rdar13278115::X' cannot bind to lvalue of type 'rdar13278115::X'}}
200defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor  X &&f1(Y &y) { return y; } // expected-error{{rvalue reference to type 'rdar13278115::X' cannot bind to lvalue of type 'rdar13278115::Y'}}
201defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor  const X &&f2(Y &y) { return y; } // expected-error{{rvalue reference to type 'const rdar13278115::X' cannot bind to lvalue of type 'rdar13278115::Y'}}
202defa32ef4fdc166d39d2d0859e5edbd78da2ddd0Douglas Gregor}
2031fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2041fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rosenamespace bitfields {
2051fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  struct IntBitfield {
2061fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    int i : 17; // expected-note 3 {{bit-field is declared here}}
2071fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  };
2081fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2091fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  // A simplified version of std::move.
2101fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  template <typename T>
2111fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  T &&move(T &obj) {
2121fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    return static_cast<T &&>(obj);
2131fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  }
2141fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2151fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  void test() {
2161fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    int & ir1 = (lvalue<IntBitfield>().i); // expected-error{{non-const reference cannot bind to bit-field 'i'}}
2171fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    int & ir2 = (xvalue<IntBitfield>().i); // expected-error{{non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'}}
2181fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    int && ir3 = (xvalue<IntBitfield>().i); // no-warning
2191fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    int && ir4 = move(lvalue<IntBitfield>()).i; // no-warning
2201fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2211fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    volatile int & vir1 = (lvalue<IntBitfield>().i); // expected-error{{non-const reference cannot bind to bit-field 'i'}}
2221fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    volatile int & vir2 = (xvalue<IntBitfield>().i); // expected-error{{volatile lvalue reference to type 'volatile int' cannot bind to a temporary of type 'int'}}
2231fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    volatile int && vir3 = (xvalue<IntBitfield>().i); // no-warning
2241fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    volatile int && vir4 = move(lvalue<IntBitfield>()).i; // no-warning
2251fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2261fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const int & cir1 = (lvalue<IntBitfield>().i); // no-warning
2271fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const int & cir2 = (xvalue<IntBitfield>().i); // no-warning
2281fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const int && cir3 = (xvalue<IntBitfield>().i); // no-warning
2291fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const int && cir4 = move(lvalue<IntBitfield>()).i; // no-warning
2301fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose
2311fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const volatile int & cvir1 = (lvalue<IntBitfield>().i); // expected-error{{non-const reference cannot bind to bit-field 'i'}}
2321fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const volatile int & cvir2 = (xvalue<IntBitfield>().i); // expected-error{{volatile lvalue reference to type 'const volatile int' cannot bind to a temporary of type 'int'}}
2331fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const volatile int && cvir3 = (xvalue<IntBitfield>().i); // no-warning
2341fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose    const volatile int && cvir4 = move(lvalue<IntBitfield>()).i; // no-warning
2351fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose  }
2361fd1e288d0f45b86d191d8f53f569e5143f3a18aJordan Rose}
237