[PATCH 0/1] MR11566: tests: Fix tests that are faulty because of == vs ?: operator precedence.
`==` has higher precedence than `?:`, meaning that a test like `ok(hr == (i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED, ...)` is parsed as `(hr == (i < 4)) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED` and not the intended `hr == ((i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED)`. I discovered this when converting `wine/test.h` to use `bool` for conditions (MR coming soon), this generated warnings like: ``` ../dlls/amstream/tests/amstream.c: In function 'test_media_types': ../dlls/amstream/tests/amstream.c:3159:33: warning: '?:' using integer constants in boolean context [-Wint-in-bool-context] 3159 | ok(hr == (i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx on ReceiveConnection for subtype %s.\n", hr, ../include/wine/test.h:388:53: note: in definition of macro 'winetest_ok' 388 | #define winetest_ok(cond, ...) (winetest_should_log(cond) ? winetest_ok_(__VA_ARGS__) : winetest_ok_(NULL)) | ^~~~ ../include/wine/test.h:129:18: note: in expansion of macro 'ok_' 129 | #define ok ok_(__FILE__, __LINE__) | ^~~ ../dlls/amstream/tests/amstream.c:3159:9: note: in expansion of macro 'ok' 3159 | ok(hr == (i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx on ReceiveConnection for subtype %s.\n", hr, ``` -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566
From: Brendan Shanks <bshanks@codeweavers.com> --- dlls/amstream/tests/amstream.c | 2 +- dlls/d3d9/tests/visual.c | 2 +- dlls/dinput/tests/hid.c | 2 +- dlls/dxgi/tests/dxgi.c | 2 +- dlls/gdi32/tests/gdiobj.c | 4 ++-- dlls/iphlpapi/tests/iphlpapi.c | 4 ++-- dlls/kernel32/tests/locale.c | 8 ++++---- dlls/kernel32/tests/virtual.c | 2 +- dlls/msvcp120/tests/msvcp120.c | 4 ++-- dlls/ntdll/tests/exception.c | 10 +++++----- dlls/ucrtbase/tests/misc.c | 16 ++++++++-------- dlls/ws2_32/tests/protocol.c | 2 +- 12 files changed, 29 insertions(+), 29 deletions(-) diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index dbff4eb42f9..a9ae9c8e769 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -3156,7 +3156,7 @@ static void test_media_types(void) ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx for subtype %s.\n", hr, wine_dbgstr_guid(rejected_subtypes[i].guid)); hr = IPin_ReceiveConnection(pin, &source.source.pin.IPin_iface, &mt); - ok(hr == (i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#lx on ReceiveConnection for subtype %s.\n", hr, + ok(hr == ((i < 4) ? S_OK : VFW_E_TYPE_NOT_ACCEPTED), "Got hr %#lx on ReceiveConnection for subtype %s.\n", hr, wine_dbgstr_guid(rejected_subtypes[i].guid)); if (hr == S_OK) diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index e070210c6d1..8cb932dd3bb 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -4467,7 +4467,7 @@ static void stretchrect_test(void) hr = IDirect3DDevice9_StretchRect(device, surfaces[test->src], test->src_rect, surfaces[test->dst], test->dst_rect, test->filter); todo_wine_if(test->todo) - ok(hr == test->allowed ? D3D_OK : D3DERR_INVALIDCALL, "Test %u, got unexpected hr %#lx.\n", i, hr); + ok(hr == (test->allowed ? D3D_OK : D3DERR_INVALIDCALL), "Test %u, got unexpected hr %#lx.\n", i, hr); } for (i = 0; i < ARRAY_SIZE(surfaces); ++i) diff --git a/dlls/dinput/tests/hid.c b/dlls/dinput/tests/hid.c index dfd35156f22..262bf082a4b 100644 --- a/dlls/dinput/tests/hid.c +++ b/dlls/dinput/tests/hid.c @@ -2610,7 +2610,7 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle ret = GetOverlappedResult( async_file, &overlapped, &value, TRUE ); ok( ret, "GetOverlappedResult failed, last error %lu\n", GetLastError() ); - ok( value == report_id ? 2 : caps.InputReportByteLength - 1, + ok( value == (report_id ? 2 : caps.InputReportByteLength - 1), "got length %lu, expected %u\n", value, report_id ? 2 : caps.InputReportByteLength - 1 ); CloseHandle( overlapped.hEvent ); diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c index 59ed17f00a2..2c562438eca 100644 --- a/dlls/dxgi/tests/dxgi.c +++ b/dlls/dxgi/tests/dxgi.c @@ -8088,7 +8088,7 @@ static void test_colour_space_support(IUnknown *device, BOOL is_d3d12) } hr = IDXGISwapChain3_SetColorSpace1(swapchain3, colour_spaces[i]); - ok(hr == (support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT) ? S_OK : E_INVALIDARG, + ok(hr == ((support & DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT) ? S_OK : E_INVALIDARG), "Got unexpected hr %#lx for text %u.\n", hr, i); } diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c index ffe376abed7..25aa109a9fe 100644 --- a/dlls/gdi32/tests/gdiobj.c +++ b/dlls/gdi32/tests/gdiobj.c @@ -403,7 +403,7 @@ static void test_shared_handle_entry( HGDIOBJ obj, unsigned int type, BOOL is_st "Type = %x, expected %x\n", entry->Type, type & 0x1f); ok(entry->Object, "Object = NULL\n"); ok(entry->Owner.Count == 0, "Count = %u\n", entry->Owner.Count); - ok(entry->Generation <= (sizeof(void *) == 8) ? 127 : 255, "Generation = %u\n", entry->Generation); + ok(entry->Generation <= ((sizeof(void *) == 8) ? 127 : 255), "Generation = %u\n", entry->Generation); } static void test_shared_handle_table(void) @@ -446,7 +446,7 @@ static void test_shared_handle_table(void) ok(entry->Owner.ProcessId == GetCurrentProcessId(), "ProcessId = %x, expected %lx\n", entry->Owner.ProcessId, GetCurrentProcessId()); ok(entry->Owner.Count == 0, "Count = %u\n", entry->Owner.Count); - ok(entry->Generation <= (sizeof(void *) == 8) ? 127 : 255, "Generation = %u\n", entry->Generation); + ok(entry->Generation <= ((sizeof(void *) == 8) ? 127 : 255), "Generation = %u\n", entry->Generation); test_shared_handle_entry( GetStockObject( WHITE_PEN ), NTGDI_OBJ_PEN, TRUE ); test_shared_handle_entry( GetStockObject( WHITE_BRUSH ), NTGDI_OBJ_BRUSH, TRUE ); diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index 982880fdb9d..775d734bb02 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -3459,7 +3459,7 @@ static void test_ParseNetworkString(void) ok(ret == ipv4_address_tests[i].ret, "%s gave error %ld\n", ipv4_address_tests[i].str, ret); - ok(info.Format == ret ? NET_ADDRESS_FORMAT_UNSPECIFIED : NET_ADDRESS_IPV4, + ok(info.Format == (ret ? NET_ADDRESS_FORMAT_UNSPECIFIED : NET_ADDRESS_IPV4), "%s gave format %d\n", ipv4_address_tests[i].str, info.Format); ok(info.Ipv4Address.sin_addr.S_un.S_addr == (ret ? 0x99999999 : ipv4_address_tests[i].addr.S_un.S_addr), "%s gave address %d.%d.%d.%d\n", ipv4_address_tests[i].str, @@ -3485,7 +3485,7 @@ static void test_ParseNetworkString(void) ok(ret == ipv4_service_tests[i].ret, "%s gave error %ld\n", ipv4_service_tests[i].str, ret); - ok(info.Format == ret ? NET_ADDRESS_FORMAT_UNSPECIFIED : NET_ADDRESS_IPV4, + ok(info.Format == (ret ? NET_ADDRESS_FORMAT_UNSPECIFIED : NET_ADDRESS_IPV4), "%s gave format %d\n", ipv4_address_tests[i].str, info.Format); ok(info.Ipv4Address.sin_addr.S_un.S_addr == (ret ? 0x99999999 : ipv4_service_tests[i].addr.S_un.S_addr), "%s gave address %d.%d.%d.%d\n", ipv4_service_tests[i].str, diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c index d957c2f4019..7d956bca38f 100644 --- a/dlls/kernel32/tests/locale.c +++ b/dlls/kernel32/tests/locale.c @@ -5531,7 +5531,7 @@ static void test_IdnToNameprepUnicode(void) test_data[1].in_len, NULL, 0); err = GetLastError(); ok(ret == test_data[1].ret, "ret = %ld\n", ret); - ok(err == ret ? 0xdeadbeef : ERROR_INVALID_NAME, "err = %ld\n", err); + ok(err == (ret ? 0xdeadbeef : ERROR_INVALID_NAME), "err = %ld\n", err); SetLastError(0xdeadbeef); ret = pIdnToNameprepUnicode(0, test_data[0].in, -1, buf, ARRAY_SIZE(buf)); @@ -5580,7 +5580,7 @@ static void test_IdnToNameprepUnicode(void) if (ret == test_data[i].ret) { - ok(err == ret ? 0xdeadbeef : ERROR_INVALID_NAME, "%ld: err = %ld\n", i, err); + ok(err == (ret ? 0xdeadbeef : ERROR_INVALID_NAME), "%ld: err = %ld\n", i, err); ok(!wcsncmp(test_data[i].out, buf, ret), "%ld: buf = %s\n", i, wine_dbgstr_wn(buf, ret)); } if (pRtlNormalizeString) @@ -5639,7 +5639,7 @@ static void test_IdnToAscii(void) ret = pIdnToAscii(test_data[i].flags, test_data[i].in, test_data[i].in_len, buf, ARRAY_SIZE(buf)); err = GetLastError(); ok(ret == test_data[i].ret || broken(ret == test_data[i].broken_ret), "%ld: ret = %ld\n", i, ret); - ok(err == ret ? 0xdeadbeef : ERROR_INVALID_NAME, "%ld: err = %ld\n", i, err); + ok(err == (ret ? 0xdeadbeef : ERROR_INVALID_NAME), "%ld: err = %ld\n", i, err); ok(!wcsnicmp(test_data[i].out, buf, ret), "%ld: buf = %s\n", i, wine_dbgstr_wn(buf, ret)); } } @@ -5687,7 +5687,7 @@ static void test_IdnToUnicode(void) ret = pIdnToUnicode(test_data[i].flags, test_data[i].in, test_data[i].in_len, buf, ARRAY_SIZE(buf)); err = GetLastError(); ok(ret == test_data[i].ret || broken(ret == test_data[i].broken_ret), "%ld: ret = %ld\n", i, ret); - ok(err == ret ? 0xdeadbeef : ERROR_INVALID_NAME, "%ld: err = %ld\n", i, err); + ok(err == (ret ? 0xdeadbeef : ERROR_INVALID_NAME), "%ld: err = %ld\n", i, err); ok(!wcsncmp(test_data[i].out, buf, ret), "%ld: buf = %s\n", i, wine_dbgstr_wn(buf, ret)); } } diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c index 74b03ec8f54..af740a250ac 100644 --- a/dlls/kernel32/tests/virtual.c +++ b/dlls/kernel32/tests/virtual.c @@ -4200,7 +4200,7 @@ static void test_mapping( HANDLE hfile, DWORD sec_flags, BOOL readonly ) ok(info.AllocationProtect == info.Protect, "%ld: (%04lx) got %#lx, expected %#lx\n", j, view[j].access, info.AllocationProtect, info.Protect); ok(info.State == MEM_COMMIT, "%ld: (%04lx) got %#lx, expected MEM_COMMIT\n", j, view[j].access, info.State); - ok(info.Type == (sec_flags & SEC_IMAGE) ? SEC_IMAGE : MEM_MAPPED, + ok(info.Type == ((sec_flags & SEC_IMAGE) ? SEC_IMAGE : MEM_MAPPED), "%ld: (%04lx) got %#lx, expected MEM_MAPPED\n", j, view[j].access, info.Type); if (nt_base && base) diff --git a/dlls/msvcp120/tests/msvcp120.c b/dlls/msvcp120/tests/msvcp120.c index 5e8e065b062..d56c832a791 100644 --- a/dlls/msvcp120/tests/msvcp120.c +++ b/dlls/msvcp120/tests/msvcp120.c @@ -2461,13 +2461,13 @@ static void test__Mtx(void) r = p__Mtx_trylock(&mtx); ok(r == expect, "_Mtx_trylock returned %x (flags %x)\n", r, flags[i]); ok(mtx->thread_id == GetCurrentThreadId(), "mtx.thread_id = %lx (flags %x)\n", mtx->thread_id, flags[i]); - ok(mtx->count == r ? 1 : 2, "mtx.count = %lu, expected %u (flags %x)\n", mtx->count, r ? 1 : 2, flags[i]); + ok(mtx->count == (r ? 1 : 2), "mtx.count = %lu, expected %u (flags %x)\n", mtx->count, r ? 1 : 2, flags[i]); if(!r) p__Mtx_unlock(&mtx); r = p__Mtx_lock(&mtx); ok(r == expect, "_Mtx_lock returned %x (flags %x)\n", r, flags[i]); ok(mtx->thread_id == GetCurrentThreadId(), "mtx.thread_id = %lx (flags %x)\n", mtx->thread_id, flags[i]); - ok(mtx->count == r ? 1 : 2, "mtx.count = %lu, expected %u (flags %x)\n", mtx->count, r ? 1 : 2, flags[i]); + ok(mtx->count == (r ? 1 : 2), "mtx.count = %lu, expected %u (flags %x)\n", mtx->count, r ? 1 : 2, flags[i]); if(!r) p__Mtx_unlock(&mtx); p__Mtx_unlock(&mtx); diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index abeae85a068..c7fa6669202 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -1580,7 +1580,7 @@ static DWORD simd_fault_handler( EXCEPTION_RECORD *rec, EXCEPTION_REGISTRATION_R ok( rec->ExceptionCode == STATUS_FLOAT_MULTIPLE_TRAPS, "exception code: %#lx, should be %#lx\n", rec->ExceptionCode, STATUS_FLOAT_MULTIPLE_TRAPS); - ok( rec->NumberParameters == is_wow64 ? 2 : 1, "# of params: %li\n", rec->NumberParameters); + ok( rec->NumberParameters == (is_wow64 ? 2 : 1), "# of params: %li\n", rec->NumberParameters); ok( rec->ExceptionInformation[0] == 0, "param #1: %Ix, should be 0\n", rec->ExceptionInformation[0]); if (rec->NumberParameters == 2) ok( rec->ExceptionInformation[1] == ((XSAVE_FORMAT *)context->ExtendedRegisters)->MxCsr, @@ -4681,7 +4681,7 @@ static void test_wow64_context(void) context.ContextFlags = CONTEXT_ALL; ret = pNtGetContextThread( pi.hThread, &context ); ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); - ok( context.ContextFlags == is_arm64ec ? CONTEXT_FULL : CONTEXT_ALL, + ok( context.ContextFlags == (is_arm64ec ? CONTEXT_FULL : CONTEXT_ALL), "got context flags %#lx\n", context.ContextFlags ); ok( !context.Rsi, "rsi is not zero %Ix\n", context.Rsi ); ok( !context.Rdi, "rdi is not zero %Ix\n", context.Rdi ); @@ -11394,10 +11394,10 @@ static void test_extended_context(void) context_flags = *(DWORD *)(context_buffer + context_arch[test].flags_offset); ok(context_flags == (bret ? flags_fpx : flags), "Got unexpected ContextFlags %#lx, flags %#lx.\n", context_flags, flags); - ok(xs->Mask == bret ? 4 : 0xdeadbeef, "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask)); + ok(xs->Mask == (bret ? 4 : 0xdeadbeef), "Got unexpected Mask %s.\n", wine_dbgstr_longlong(xs->Mask)); mask = pRtlGetExtendedFeaturesMask(context_ex); ok(mask == (xs->Mask & ~(ULONG64)3), "Got unexpected mask %s.\n", wine_dbgstr_longlong(mask)); - ok(xs->CompactionMask == bret ? expected_compaction : 0xdeadbeef, "Got unexpected CompactionMask %s.\n", + ok(xs->CompactionMask == (bret ? expected_compaction : 0xdeadbeef), "Got unexpected CompactionMask %s.\n", wine_dbgstr_longlong(xs->CompactionMask)); mask = 0xdeadbeef; @@ -11439,7 +11439,7 @@ static void test_extended_context(void) length2 = 0xdeadbeef; p = pLocateXStateFeature(context, 2, &length2); - ok(!p && length2 == (flags & CONTEXT_NATIVE) ? sizeof(YMMCONTEXT) : 0xdeadbeef, + ok(!p && length2 == ((flags & CONTEXT_NATIVE) ? sizeof(YMMCONTEXT) : 0xdeadbeef), "Got unexpected p %p, length %#lx, flags %#lx.\n", p, length2, flags); context_flags = *(DWORD *)(context_buffer + context_arch[test].flags_offset); diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c index 050f1fbb526..f8892d66a7c 100644 --- a/dlls/ucrtbase/tests/misc.c +++ b/dlls/ucrtbase/tests/misc.c @@ -1824,10 +1824,10 @@ static void test_exp(void) ok(signbit(r) == signbit(tests[i].exp), "expected sign %x, got %x for %d\n", signbit(tests[i].exp), signbit(r), i); - ok(e == tests[i].e ? tests[i].e : -1, + ok(e == (tests[i].e ? tests[i].e : -1), "expected errno %d, but got %d for %d\n", tests[i].e, e, i); - ok(exception.type == tests[i].type ? tests[i].type : -1, + ok(exception.type == (tests[i].type ? tests[i].type : -1), "expected %d, got %d for %d\n", tests[i].type, exception.type, i); } @@ -1873,10 +1873,10 @@ static void test_expf(void) "expected sign %x, got %x for %d\n", signbit(tests[i].exp), signbit(r), i); } - ok(e == tests[i].e ? tests[i].e : -1, + ok(e == (tests[i].e ? tests[i].e : -1), "expected errno %d, but got %d for %d\n", tests[i].e, e, i); - ok(exception.type == tests[i].type ? tests[i].type : -1, + ok(exception.type == (tests[i].type ? tests[i].type : -1), "expected %d, got %d for %d\n", tests[i].type, exception.type, i); } @@ -1969,10 +1969,10 @@ static void test_cexp(void) signbit(tests[i].iexp), signbit(r._Val[1]), i); } - ok(e == tests[i].e ? tests[i].e : -1, + ok(e == (tests[i].e ? tests[i].e : -1), "expected errno %d, but got %d for %d\n", tests[i].e, e, i); - ok(exception.type == tests[i].type ? tests[i].type : -1, + ok(exception.type == (tests[i].type ? tests[i].type : -1), "expected %d, got %d for %d\n", tests[i].type, exception.type, i); } @@ -1985,10 +1985,10 @@ static void test_cexp(void) ok(compare_double(r._Val[0], tests2[i].rexp, 1), "expected %0.16e, got %0.16e for real %d\n", tests2[i].rexp, r._Val[0], i); ok(compare_double(r._Val[1], tests2[i].iexp, 1), "expected %0.16e, got %0.16e for imag %d\n", tests2[i].iexp, r._Val[1], i); - ok(e == tests2[i].e ? tests2[i].e : -1, + ok(e == (tests2[i].e ? tests2[i].e : -1), "expected errno %d, but got %d for %d\n", tests2[i].e, e, i); - ok(exception.type == tests2[i].type ? tests2[i].type : -1, + ok(exception.type == (tests2[i].type ? tests2[i].type : -1), "expected %d, got %d for %d\n", tests2[i].type, exception.type, i); } diff --git a/dlls/ws2_32/tests/protocol.c b/dlls/ws2_32/tests/protocol.c index 76339c0a146..ada5b615589 100644 --- a/dlls/ws2_32/tests/protocol.c +++ b/dlls/ws2_32/tests/protocol.c @@ -1065,7 +1065,7 @@ static void test_inet_pton(void) WSASetLastError(0xdeadbeef); addr = inet_addr(ipv4_tests[i].input); - ok(addr == ipv4_tests[i].ret ? ipv4_tests[i].addr : INADDR_NONE, "got addr %#08lx\n", addr); + ok(addr == (ipv4_tests[i].ret ? ipv4_tests[i].addr : INADDR_NONE), "got addr %#08lx\n", addr); ok(WSAGetLastError() == 0xdeadbeef, "got error %u\n", WSAGetLastError()); winetest_pop_context(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11566
@gofman, @zfigura, @epo: There's a test in ws2_32:protocol that's failing on Windows after being fixed, but I'm not sure this test makes sense. It's running the `inet_pton()` tests against `inet_addr()`, but these are different functions and we have separate tests for `inet_addr()`. Should I just remove it? 027d7db8159e6d104730f66406a54907c95bc823 ("ws2_32/tests: Enable compilation with long types.") added the faulty test -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148064
It fails similar way on Wine. I recall adding inet_addr tests and fixing inet_addr() impl in commit 18230d23c599f1f5f9dd419dccc11c49117cc3b8. Yes, looks apparent that is just a wrong test which was accidentally succeeding due to mentioned operator precedence and should be removed. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148066
Yes, that test looks wrong; I guess it must have been added by accident? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148073
I think it was added not by Eric %%lu commit but by you while doing PE split? IIRC you even mentioned reviewing my inet_addr MR that this test can probably be removed but none of us followed up on that. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148076
I think it was added not by Eric %%lu commit but by you while doing PE split? IIRC you even mentioned reviewing my inet_addr MR that this test can probably be removed but none of us followed up on that.
I'm confused? As far as I can see I did originally add it in b159f6e256, then you did in fact remove it in 18230d23c when fixing the implementation to no longer forward to inet_pton, then somehow Erich added it back when doing the long types conversion in 027d7db815. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148107
Ah... so we actually removed it back then but Eric added it back. Obviously incidentally. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148110
What a journey, thanks for clearing it up. !11598 removes it. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/11566#note_148120
participants (4)
-
Brendan Shanks -
Brendan Shanks (@bshanks) -
Elizabeth Figura (@zfigura) -
Paul Gofman (@gofman)