// PR c++/101165 - P2266R1 - Simpler implicit move
// { dg-do compile { target c++20 } }
// Test from P2266R1, $ 3.3. Two overload resolutions are overly confusing.
struct Widget {
    Widget();
    Widget(Widget&&);
};
struct Frodo {
    Frodo(Widget&);
    Frodo(Widget&&) = delete;
};
struct Sam {
    Sam(Widget&) = delete; // #1
    Sam(const Widget&);  // #2
};
Sam twelve() {
    Widget w;
    // This is supposed to call #2 since C++20 because P1155.
    // But we actually choose #1 since r11-2411 (in C++20 only).
    return w; // { dg-error "deleted" "" { target c++20_only } }
}
Frodo thirteen() {
    Widget w;
    // This is a correct error in both C++20 and C++23.
    return w;  // { dg-error "use of deleted function" }
}
struct Merry {};
struct Pippin {};
struct Together : Merry, Pippin {};
struct Quest {
    Quest(Merry&&);
    Quest(Pippin&&);
    Quest(Together&);
};
Quest fourteen() {
  Together t;
  // C++20: calls Quest(Together&).  Proposed: ill-formed.
  return t; // { dg-error "ambiguous" "" { target c++23 } }
}