blob: f38f4586f6afc639dbd7d8df9a70822bfc8e799c [file] [log] [blame]
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -fcxx-exceptions -verify=cxx20 %s
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -fcxx-exceptions -verify=cxx11_14_17 %s
// RUN: %clang_cc1 -std=c++14 -fsyntax-only -fcxx-exceptions -verify=cxx11_14_17 %s
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -fcxx-exceptions -verify=cxx11_14_17 %s
// cxx20-no-diagnostics
// Throwing
namespace test_throwing {
class Widget {
public:
Widget(Widget &&);
Widget(const Widget &) = delete;
};
void seven(Widget w) {
throw w; // Clang already do this implicit move before -std=c++20
}
} // namespace test_throwing
// Non-constructor conversion
namespace test_non_constructor_conversion {
class Widget {};
struct To {
operator Widget() const & = delete; // cxx11_14_17-note {{'operator Widget' has been explicitly marked deleted here}}
operator Widget() &&;
};
Widget nine() {
To t;
return t; // cxx11_14_17-error {{conversion function from 'test_non_constructor_conversion::To' to 'test_non_constructor_conversion::Widget' invokes a deleted function}}
}
} // namespace test_non_constructor_conversion
// By-value sinks
namespace test_by_value_sinks {
class Widget {
public:
Widget();
Widget(Widget &&);
Widget(const Widget &) = delete; // cxx11_14_17-note {{'Widget' has been explicitly marked deleted here}}
};
struct Fowl {
Fowl(Widget); // cxx11_14_17-note {{passing argument to parameter here}}
};
Fowl eleven() {
Widget w;
return w; // cxx11_14_17-error {{call to deleted constructor of 'test_by_value_sinks::Widget'}}
}
} // namespace test_by_value_sinks
// Slicing
namespace test_slicing {
class Base {
public:
Base();
Base(Base &&);
Base(Base const &) = delete; // cxx11_14_17-note {{'Base' has been explicitly marked deleted here}}
};
class Derived : public Base {};
Base thirteen() {
Derived result;
return result; // cxx11_14_17-error {{call to deleted constructor of 'test_slicing::Base'}}
}
} // namespace test_slicing