test: Add the original test case for atomic loads of varying sizes

This covers the original testcase from
https://github.com/mstorsjo/llvm-mingw/issues/538.
This commit is contained in:
Martin Storsjö
2026-02-13 14:48:46 +02:00
parent 49afca5984
commit dc9837d908
2 changed files with 47 additions and 1 deletions
+1 -1
View File
@@ -74,7 +74,7 @@ TESTS_C_LINK_DLL = autoimport-main
TESTS_C_NO_BUILTIN = crt-test
TESTS_C_ANSI_STDIO = crt-test
TESTS_C_AS_CPP = crt-test
TESTS_CPP = hello-cpp global-terminate tlstest-main longjmp-cleanup
TESTS_CPP = hello-cpp global-terminate tlstest-main longjmp-cleanup atomic-load-sizes
TESTS_CPP_EXCEPTIONS = hello-exception exception-locale exception-reduced exception-catch-ptr-ref
TESTS_CPP_STATIC = hello-exception
TESTS_CPP_DLL = tlstest-lib throwcatch-lib
+46
View File
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2026 Martin Storsjo
*
* This file is part of llvm-mingw.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <array>
#include <atomic>
#include <cstdint>
#include <iostream>
#include <numeric>
int retval = 0;
template <std::size_t size, std::size_t max_size>
void f() {
using type_t = std::array<std::uint8_t, size>;
type_t init;
for (std::size_t i = 0; i < size; i++)
init[i] = i;
std::atomic<type_t> atom(init);
bool match = atom.load() == init;
std::cout << size << " byte atomic: " << (match ? "ok\n" : "FAILED\n");
if (!match)
retval = 1;
if constexpr (size < max_size) {
f<size + 1, max_size>();
}
}
int main() {
f<1, 32>();
return retval;
}