blob: a698fc9f3abf98ae186320d2f298c2f45d87c48a [file] [log] [blame]
// 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 } }
}