render the function deleted instead of rendering the program ill-formed. This change also adds an enabled-by-default warning for the case where an explicitly-defaulted special member function of a non-template class is implicitly deleted by the type checking rules. (This fires either due to this language change or due to pre-C++20 reasons for the member being implicitly deleted). I've tested this on a large codebase and found only bugs (where the program means something that's clearly different from what the programmer intended), so this is enabled by default, but we should revisit this if there are problems with this being enabled by default. llvm-svn: 343285
31 lines
835 B
C++
31 lines
835 B
C++
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -Wno-defaulted-function-deleted
|
|
// RUN: %clang_cc1 -std=c++11 -fcxx-exceptions -DCXX_EXCEPTIONS -fsyntax-only -verify %s -Wno-defaulted-function-deleted
|
|
|
|
template <class _Tp> struct is_nothrow_move_constructible {
|
|
static const bool value = false;
|
|
};
|
|
|
|
template <class _Tp>
|
|
class allocator;
|
|
|
|
template <>
|
|
class allocator<char> {};
|
|
|
|
template <class _Allocator>
|
|
class basic_string {
|
|
typedef _Allocator allocator_type;
|
|
basic_string(basic_string &&__str)
|
|
noexcept(is_nothrow_move_constructible<allocator_type>::value);
|
|
};
|
|
|
|
class Foo {
|
|
Foo(Foo &&) noexcept = default;
|
|
#ifdef CXX_EXCEPTIONS
|
|
// expected-error@-2 {{does not match the calculated}}
|
|
#else
|
|
// expected-no-diagnostics
|
|
#endif
|
|
Foo &operator=(Foo &&) noexcept = default;
|
|
basic_string<allocator<char> > vectorFoo_;
|
|
};
|