(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
cpp23/
elision2.C
// 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 } }
}