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