[clang] 56131e3 - [clang][bytecode] Diagnose incomplete types more consistently (#153368)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 13 01:40:25 PDT 2025
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 {
More information about the cfe-commits
mailing list