MSVC trait is_trivial is bugged
MSVC type_trait std::is_trivial is not working correctly :
Repro : https://godbolt.org/g/ftRNYS
Repro code :
#include <type_traits>
struct trivial_full {
trivial_full() = default;
trivial_full(const trivial_full&) = default;
trivial_full(trivial_full&&) = default;
trivial_full& operator=(const trivial_full&) = default;
trivial_full& operator=(trivial_full&&) = default;
};
struct non_trivial_virtual_destructor {
virtual ~non_trivial_virtual_destructor(){};
};
struct trivial_on_copy_constructor {
trivial_on_copy_constructor() = default;
trivial_on_copy_constructor(const trivial_on_copy_constructor&) = default;
trivial_on_copy_constructor(trivial_on_copy_constructor&&) = delete;
trivial_on_copy_constructor& operator=(const trivial_on_copy_constructor&) = delete;
trivial_on_copy_constructor& operator=(trivial_on_copy_constructor&&) = delete;
};
struct trivial_on_move_constructor {
trivial_on_move_constructor() = default;
trivial_on_move_constructor(const trivial_on_move_constructor&) = delete;
trivial_on_move_constructor(trivial_on_move_constructor&&) = default;
trivial_on_move_constructor& operator=(const trivial_on_move_constructor&) = delete;
trivial_on_move_constructor& operator=(trivial_on_move_constructor&&) = delete;
};
struct trivial_on_copy_assignement {
trivial_on_copy_assignement() = default;
trivial_on_copy_assignement(const trivial_on_copy_assignement&) = delete;
trivial_on_copy_assignement(trivial_on_copy_assignement&&) = delete;
trivial_on_copy_assignement& operator=(const trivial_on_copy_assignement&) = default;
trivial_on_copy_assignement& operator=(trivial_on_copy_assignement&&) = delete;
};
struct trivial_on_move_assignement {
trivial_on_move_assignement() = default;
trivial_on_move_assignement(const trivial_on_move_assignement&) = delete;
trivial_on_move_assignement(trivial_on_move_assignement&&) = delete;
trivial_on_move_assignement& operator=(const trivial_on_move_assignement&) = delete;
trivial_on_move_assignement& operator=(trivial_on_move_assignement&&) = default;
};
struct non_trivial {
non_trivial()
{
}
};
static_assert(std::is_trivial_v<trivial_full>, "");
static_assert(std::is_trivial_v<trivial_on_copy_constructor>, "");
static_assert(std::is_trivial_v<trivial_on_move_constructor>, "");
static_assert(std::is_trivial_v<trivial_on_copy_assignement>, "");
static_assert(std::is_trivial_v<trivial_on_move_assignement>, "");
static_assert(!std::is_trivial_v<non_trivial_virtual_destructor>, "");
static_assert(!std::is_trivial_v<non_trivial>, "");
MSVC bug report : https://developercommunity.visualstudio.com/content/problem/170883/msvc-type-traits-stdis-trivial-is-bugged.html
Fix unit test switch once bug is address by MSVC team here : https://gitlab.lrde.epita.fr/mroynard/metaprog/blob/dev/test/metaprog/cpt/layout.cpp#L73