Author: Timm Baeder Date: 2025-08-13T10:40:21+02:00 New Revision: 56131e3959de744e994a0a9409b079cab3c549a7
URL: https://github.com/llvm/llvm-project/commit/56131e3959de744e994a0a9409b079cab3c549a7 DIFF: https://github.com/llvm/llvm-project/commit/56131e3959de744e994a0a9409b079cab3c549a7.diff LOG: [clang][bytecode] Diagnose incomplete types more consistently (#153368) To match the diagnostics of the current interpreter. Added: Modified: clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/test/AST/ByteCode/builtin-functions.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp index 307b77846969f..ee2d532551583 100644 --- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp +++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp @@ -1783,11 +1783,24 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC, if (DestPtr.isDummy() || SrcPtr.isDummy()) return false; + if (DestPtr.getType()->isIncompleteType()) { + S.FFDiag(S.Current->getSource(OpPC), + diag::note_constexpr_memcpy_incomplete_type) + << Move << DestPtr.getType(); + return false; + } + if (SrcPtr.getType()->isIncompleteType()) { + S.FFDiag(S.Current->getSource(OpPC), + diag::note_constexpr_memcpy_incomplete_type) + << Move << SrcPtr.getType(); + return false; + } + QualType DestElemType = getElemType(DestPtr); if (DestElemType->isIncompleteType()) { S.FFDiag(S.Current->getSource(OpPC), - diag::note_constexpr_ltor_incomplete_type) - << DestElemType; + diag::note_constexpr_memcpy_incomplete_type) + << Move << DestElemType; return false; } @@ -1832,16 +1845,6 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC, return false; } - if (DestElemType->isIncompleteType() || - DestPtr.getType()->isIncompleteType()) { - QualType DiagType = - DestElemType->isIncompleteType() ? DestElemType : DestPtr.getType(); - S.FFDiag(S.Current->getSource(OpPC), - diag::note_constexpr_memcpy_incomplete_type) - << Move << DiagType; - return false; - } - if (!DestElemType.isTriviallyCopyableType(ASTCtx)) { S.FFDiag(S.Current->getSource(OpPC), diag::note_constexpr_memcpy_nontrivial) << Move << DestElemType; @@ -2030,8 +2033,13 @@ static bool interp__builtin_memchr(InterpState &S, CodePtr OpPC, return true; } - if (Ptr.isDummy()) + if (Ptr.isDummy()) { + if (Ptr.getType()->isIncompleteType()) + S.FFDiag(S.Current->getSource(OpPC), + diag::note_constexpr_ltor_incomplete_type) + << Ptr.getType(); return false; + } // Null is only okay if the given size is 0. if (Ptr.isZero()) { diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp index e554ef41a8d0f..1223cf8bdc74f 100644 --- a/clang/test/AST/ByteCode/builtin-functions.cpp +++ b/clang/test/AST/ByteCode/builtin-functions.cpp @@ -1514,7 +1514,7 @@ namespace Memchr { extern struct Incomplete incomplete; static_assert(__builtin_memchr(&incomplete, 0, 0u) == nullptr); static_assert(__builtin_memchr(&incomplete, 0, 1u) == nullptr); // both-error {{not an integral constant}} \ - // ref-note {{read of incomplete type 'struct Incomplete'}} + // both-note {{read of incomplete type 'struct Incomplete'}} const unsigned char &u1 = 0xf0; auto &&i1 = (const signed char []){-128}; @@ -1697,6 +1697,15 @@ namespace WMemMove { // both-note {{source of 'wmemmove' is nullptr}} static_assert(__builtin_wmemmove(null, &global, sizeof(wchar_t))); // both-error {{}} \ // both-note {{destination of 'wmemmove' is nullptr}} + + // Check that a pointer to an incomplete array is rejected. + constexpr int test_address_of_incomplete_array_type() { // both-error {{never produces a constant}} + extern int arr[]; + __builtin_memmove(&arr, &arr, 4 * sizeof(arr[0])); // both-note 2{{cannot constant evaluate 'memmove' between objects of incomplete type 'int[]'}} + return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3]; + } + static_assert(test_address_of_incomplete_array_type() == 1234); // both-error {{constant}} \ + // both-note {{in call}} } namespace Invalid { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
