Author: Timm Baeder Date: 2024-07-30T13:26:57+02:00 New Revision: 53925e33c5943bee7cf2fe29ca1274a42a5d5687
URL: https://github.com/llvm/llvm-project/commit/53925e33c5943bee7cf2fe29ca1274a42a5d5687 DIFF: https://github.com/llvm/llvm-project/commit/53925e33c5943bee7cf2fe29ca1274a42a5d5687.diff LOG: [clang][Interp] Fix primitive MoveFn (#101165) Declaring the SrcPtr as const will cause us later to call the copy ctor instead of the move ctor. Added: Modified: clang/lib/AST/Interp/Descriptor.cpp clang/test/AST/Interp/lifetimes.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Descriptor.cpp b/clang/lib/AST/Interp/Descriptor.cpp index 4f7e9eac76a32..671f2c03d7e5c 100644 --- a/clang/lib/AST/Interp/Descriptor.cpp +++ b/clang/lib/AST/Interp/Descriptor.cpp @@ -33,7 +33,8 @@ static void dtorTy(Block *, std::byte *Ptr, const Descriptor *) { template <typename T> static void moveTy(Block *, const std::byte *Src, std::byte *Dst, const Descriptor *) { - const auto *SrcPtr = reinterpret_cast<const T *>(Src); + // FIXME: Get rid of the const_cast. + auto *SrcPtr = reinterpret_cast<T *>(const_cast<std::byte *>(Src)); auto *DstPtr = reinterpret_cast<T *>(Dst); new (DstPtr) T(std::move(*SrcPtr)); } diff --git a/clang/test/AST/Interp/lifetimes.cpp b/clang/test/AST/Interp/lifetimes.cpp index d47533ab547b3..9fca54fe11120 100644 --- a/clang/test/AST/Interp/lifetimes.cpp +++ b/clang/test/AST/Interp/lifetimes.cpp @@ -33,3 +33,30 @@ struct S { constexpr int k1 = S().t; // both-error {{must be initialized by a constant expression}} \ // ref-note {{in call to}} \ // expected-note {{in call to}} + + +namespace MoveFnWorks { + template<typename T> constexpr T &&ref(T &&t) { return (T&&)t; } + + struct Buf {}; + + struct A { + constexpr A(Buf &buf) : buf(buf) { } + Buf &buf; + }; + + constexpr bool dtor_calls_dtor() { + struct B { + A &&d; + constexpr B(Buf &buf) : d(ref(A(buf))) {} + }; + + Buf buf; + { + B b(buf); + } + + return true; + } + static_assert(dtor_calls_dtor(), ""); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits