From e0487b6ce053c9054db8c0e02b72e3d9a9605f14 Mon Sep 17 00:00:00 2001 From: Nate Chandler Date: Thu, 8 Feb 2024 11:34:55 -0800 Subject: [PATCH] [BitwiseCopyable] Ban non-trivial C++ types. Such types can't be copied bit-by-bit. --- include/swift/AST/DiagnosticsSema.def | 2 ++ lib/Sema/TypeCheckBitwise.cpp | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/include/swift/AST/DiagnosticsSema.def b/include/swift/AST/DiagnosticsSema.def index a9425b50c89cc..5304c5219f592 100644 --- a/include/swift/AST/DiagnosticsSema.def +++ b/include/swift/AST/DiagnosticsSema.def @@ -7619,6 +7619,8 @@ ERROR(non_bitwise_copyable_type_noncopyable,none, "noncopyable type cannot conform to 'BitwiseCopyable'", ()) ERROR(non_bitwise_copyable_type_nonescapable,none, "nonescapable type cannot conform to 'BitwiseCopyable'", ()) +ERROR(non_bitwise_copyable_type_cxx_nontrivial,none, + "non-trivial C++ type cannot conform to 'BitwiseCopyable'", ()) ERROR(non_bitwise_copyable_type_member,none, "%select{stored property %2|associated value %2}1 of " "'BitwiseCopyable'-conforming %kind3 has non-bitwise-copyable type %0", diff --git a/lib/Sema/TypeCheckBitwise.cpp b/lib/Sema/TypeCheckBitwise.cpp index 149a96c423223..ed384bd267652 100644 --- a/lib/Sema/TypeCheckBitwise.cpp +++ b/lib/Sema/TypeCheckBitwise.cpp @@ -262,6 +262,14 @@ static bool checkBitwiseCopyableInstanceStorage(NominalTypeDecl *nominal, return true; } + auto *sd = dyn_cast(nominal); + if (sd && sd->isCxxNonTrivial()) { + if (!isImplicit(check)) { + nominal->diagnose(diag::non_bitwise_copyable_type_cxx_nontrivial); + } + return true; + } + BitwiseCopyableStorageVisitor visitor(nominal, dc, check); return visitor.visit(nominal, dc) || visitor.invalid;