Skip to content

Commit 34097c0

Browse files
authored
[clang][bytecode] Consider unknown-size arrays in memcpy/memcmp (llvm#121462)
When emitting diagnostics for the number of elements.
1 parent d5c8af4 commit 34097c0

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1871,7 +1871,9 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
18711871
size_t RemainingDestElems;
18721872
if (DestPtr.getFieldDesc()->isArray()) {
18731873
DestElemType = DestPtr.getFieldDesc()->getElemQualType();
1874-
RemainingDestElems = (DestPtr.getNumElems() - DestPtr.getIndex());
1874+
RemainingDestElems = DestPtr.isUnknownSizeArray()
1875+
? 0
1876+
: (DestPtr.getNumElems() - DestPtr.getIndex());
18751877
} else {
18761878
DestElemType = DestPtr.getType();
18771879
RemainingDestElems = 1;
@@ -1890,7 +1892,9 @@ static bool interp__builtin_memcpy(InterpState &S, CodePtr OpPC,
18901892
size_t RemainingSrcElems;
18911893
if (SrcPtr.getFieldDesc()->isArray()) {
18921894
SrcElemType = SrcPtr.getFieldDesc()->getElemQualType();
1893-
RemainingSrcElems = (SrcPtr.getNumElems() - SrcPtr.getIndex());
1895+
RemainingSrcElems = SrcPtr.isUnknownSizeArray()
1896+
? 0
1897+
: (SrcPtr.getNumElems() - SrcPtr.getIndex());
18941898
} else {
18951899
SrcElemType = SrcPtr.getType();
18961900
RemainingSrcElems = 1;

clang/test/AST/ByteCode/builtin-functions.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,6 +1263,15 @@ namespace BuiltinMemcpy {
12631263
return arr[0].ok() && arr[1].ok() && arr[2].ok();
12641264
}
12651265
static_assert(test_trivial());
1266+
1267+
// Check that an incomplete array is rejected.
1268+
constexpr int test_incomplete_array_type() { // both-error {{never produces a constant}}
1269+
extern int arr[];
1270+
__builtin_memmove(arr, arr, 4 * sizeof(arr[0]));
1271+
// both-note@-1 2{{'memmove' not supported: source is not a contiguous array of at least 4 elements of type 'int'}}
1272+
return arr[0] * 1000 + arr[1] * 100 + arr[2] * 10 + arr[3];
1273+
}
1274+
static_assert(test_incomplete_array_type() == 1234); // both-error {{constant}} both-note {{in call}}
12661275
}
12671276

12681277
namespace Memcmp {

0 commit comments

Comments
 (0)