diff --git a/llvm/include/llvm/ADT/Optional.h b/llvm/include/llvm/ADT/Optional.h --- a/llvm/include/llvm/ADT/Optional.h +++ b/llvm/include/llvm/ADT/Optional.h @@ -52,7 +52,7 @@ // of std::is_trivially_copyable. template ::value && std::is_trivially_copy_assignable::value && - (std::is_trivially_move_constructible::value || + (llvm::is_trivially_move_constructible::value || !std::is_move_constructible::value) && (std::is_trivially_move_assignable::value || !std::is_move_assignable::value))> diff --git a/llvm/unittests/ADT/OptionalTest.cpp b/llvm/unittests/ADT/OptionalTest.cpp --- a/llvm/unittests/ADT/OptionalTest.cpp +++ b/llvm/unittests/ADT/OptionalTest.cpp @@ -805,4 +805,15 @@ EXPECT_EQ(hash_value(B), hash_value(I)); } +struct ImplicitlyNonMovable { + ImplicitlyNonMovable(); // Constructor out-of-line. + virtual ~ImplicitlyNonMovable() = default; + Optional Alloc; +}; + +TEST(OptionalTest, ImplicitlyNonMovable) { + Optional V; + EXPECT_FALSE(V); +} + } // end anonymous namespace