xref: /llvm-project/clang/test/SemaCXX/P1155.cpp (revision ba15d186e5cef2620d562c6c9d9a6d570382cd0a)
1*ba15d186SMark de Wever // RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify %s
27d2d5a3aSMatheus Izvekov // RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify %s
37d2d5a3aSMatheus Izvekov // RUN: %clang_cc1 -std=c++11 -fsyntax-only -fcxx-exceptions -verify %s
47d2d5a3aSMatheus Izvekov // expected-no-diagnostics
5fbee4a0cSYang Fan 
6fbee4a0cSYang Fan // Throwing
7fbee4a0cSYang Fan namespace test_throwing {
8fbee4a0cSYang Fan class Widget {
9fbee4a0cSYang Fan public:
10fbee4a0cSYang Fan   Widget(Widget &&);
11fbee4a0cSYang Fan   Widget(const Widget &) = delete;
12fbee4a0cSYang Fan };
13fbee4a0cSYang Fan 
seven(Widget w)14fbee4a0cSYang Fan void seven(Widget w) {
157d2d5a3aSMatheus Izvekov   throw w;
16fbee4a0cSYang Fan }
17fbee4a0cSYang Fan } // namespace test_throwing
18fbee4a0cSYang Fan 
19fbee4a0cSYang Fan // Non-constructor conversion
20fbee4a0cSYang Fan namespace test_non_constructor_conversion {
21fbee4a0cSYang Fan class Widget {};
22fbee4a0cSYang Fan 
23fbee4a0cSYang Fan struct To {
247d2d5a3aSMatheus Izvekov   operator Widget() const & = delete;
25fbee4a0cSYang Fan   operator Widget() &&;
26fbee4a0cSYang Fan };
27fbee4a0cSYang Fan 
nine()28fbee4a0cSYang Fan Widget nine() {
29fbee4a0cSYang Fan   To t;
307d2d5a3aSMatheus Izvekov   return t;
31fbee4a0cSYang Fan }
32fbee4a0cSYang Fan } // namespace test_non_constructor_conversion
33fbee4a0cSYang Fan 
34fbee4a0cSYang Fan // By-value sinks
35fbee4a0cSYang Fan namespace test_by_value_sinks {
36fbee4a0cSYang Fan class Widget {
37fbee4a0cSYang Fan public:
38fbee4a0cSYang Fan   Widget();
39fbee4a0cSYang Fan   Widget(Widget &&);
407d2d5a3aSMatheus Izvekov   Widget(const Widget &) = delete;
41fbee4a0cSYang Fan };
42fbee4a0cSYang Fan 
43fbee4a0cSYang Fan struct Fowl {
447d2d5a3aSMatheus Izvekov   Fowl(Widget);
45fbee4a0cSYang Fan };
46fbee4a0cSYang Fan 
eleven()47fbee4a0cSYang Fan Fowl eleven() {
48fbee4a0cSYang Fan   Widget w;
497d2d5a3aSMatheus Izvekov   return w;
50fbee4a0cSYang Fan }
51fbee4a0cSYang Fan } // namespace test_by_value_sinks
52fbee4a0cSYang Fan 
53fbee4a0cSYang Fan // Slicing
54fbee4a0cSYang Fan namespace test_slicing {
55fbee4a0cSYang Fan class Base {
56fbee4a0cSYang Fan public:
57fbee4a0cSYang Fan   Base();
58fbee4a0cSYang Fan   Base(Base &&);
597d2d5a3aSMatheus Izvekov   Base(Base const &) = delete;
60fbee4a0cSYang Fan };
61fbee4a0cSYang Fan 
62fbee4a0cSYang Fan class Derived : public Base {};
63fbee4a0cSYang Fan 
thirteen()64fbee4a0cSYang Fan Base thirteen() {
65fbee4a0cSYang Fan   Derived result;
667d2d5a3aSMatheus Izvekov   return result;
67fbee4a0cSYang Fan }
68fbee4a0cSYang Fan } // namespace test_slicing
69