From 7cfd41982c8904bdd7707ee910fbefdd16dfdbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 26 Apr 2023 19:31:20 +0200 Subject: [PATCH] SceneTools: make the combineFields() assertion test work on ARM64. It asserted in the SceneFieldData constructor due to Trade::SceneFieldData: distance between string data and field data expected to fit into 48 bits but got 0x0 and 0xffffdad64ab9 Heh. --- src/Magnum/SceneTools/Test/CombineTest.cpp | 29 ++++++++++++++-------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/Magnum/SceneTools/Test/CombineTest.cpp b/src/Magnum/SceneTools/Test/CombineTest.cpp index c6adc1cd1..9483f6342 100644 --- a/src/Magnum/SceneTools/Test/CombineTest.cpp +++ b/src/Magnum/SceneTools/Test/CombineTest.cpp @@ -750,12 +750,11 @@ void CombineTest::fieldsMappingSharedFieldPlaceholder() { void CombineTest::fieldsStringPlaceholder() { CORRADE_SKIP_IF_NO_ASSERT(); - Containers::StringView nameStrings = ""_s; - const struct Name { + const struct Data { UnsignedByte mapping; - UnsignedByte offset; - } namesData[3]{}; - auto names = Containers::stridedArrayView(namesData); + UnsignedByte mesh; + } data[3]{}; + auto view = Containers::stridedArrayView(data); std::ostringstream out; Error redirectError{&out}; @@ -764,19 +763,27 @@ void CombineTest::fieldsStringPlaceholder() { combineFields(Trade::SceneMappingType::UnsignedByte, 167, { /* Just to verify it prints correct field IDs */ Trade::SceneFieldData{Trade::SceneField::Mesh, - names.slice(&Name::mapping), - names.slice(&Name::offset)}, + view.slice(&Data::mapping), + view.slice(&Data::mesh)}, Trade::SceneFieldData{Trade::sceneFieldCustom(16), - names.slice(&Name::mapping), + view.slice(&Data::mapping), nullptr, Trade::SceneFieldType::StringOffset8, - names.slice(&Name::offset)}, + /* Have to fake a pointer because in some cases (ARM64 Linux) the + distance between nullptr and stack-allocated memory (such as + `data`) *may* be larger than what can fit into 48 bits, + triggering an assert */ + Containers::arrayView(reinterpret_cast(0xfece5), 3)}, }); /* With placeholder field data it's impossible to know the actual string size */ combineFields(Trade::SceneMappingType::UnsignedByte, 167, { Trade::SceneFieldData{Trade::sceneFieldCustom(16), - names.slice(&Name::mapping), - nameStrings.data(), Trade::SceneFieldType::StringRangeNullTerminated16, + view.slice(&Data::mapping), + /* Have to fake a pointer because in some cases (ARM64 Linux) the + distance between nullptr and stack-allocated memory (such as + `data`) *may* be larger than what can fit into 48 bits, + triggering an assert */ + reinterpret_cast(0xfece5), Trade::SceneFieldType::StringRangeNullTerminated16, Containers::StridedArrayView1D{{nullptr, 6}, 3}}, }); CORRADE_COMPARE(out.str(),