// PR c++/101165 - P2266R1 - Simpler implicit move // { dg-do compile { target c++23 } } // { dg-options "-Wdangling-reference" } struct X { X (); X(X&&); }; X&& rref (); X&& f1 (X&& x) { return x; } template T&& f2 (T&& x) { return x; } template X& f2(X&); template X&& f2(X&&); X&& f3 () { X&& x = rref (); return x; } void f4 () try { X x; throw x; } catch (...) { } void f5 () { auto l1 = [](auto x) -> auto { return x; }; auto &&x1 = l1(X{}); auto l2 = [](auto x) -> auto& { return x; }; // { dg-error "cannot bind non-const lvalue reference" } auto &&x2 = l2(X{}); auto l3 = [](auto x) -> auto&& { return x; }; // { dg-warning "reference to local" } auto &&x3 = l3(X{}); } constexpr int & f6 (int &&n) { return n; // { dg-error "cannot bind non-const lvalue reference" } } void do_f6 () { auto x = f6 (42); } template auto & f7 (T &&t) { return t; // { dg-error "cannot bind non-const lvalue reference" } } void do_f7 () { const int &x = f7 (0); // { dg-warning "dangling reference" } }