From 360026508b3c661f50abd06ba76b8e704ec97eb1 Mon Sep 17 00:00:00 2001 From: Logikoma Date: Wed, 5 Aug 2026 23:34:47 -0400 Subject: [PATCH] Test ignored-error storage across translation units --- CMakeLists.txt | 16 ++++++++++++++++ tests/err_ignore_multitu.c | 18 ++++++++++++++++++ tests/err_ignore_multitu.h | 8 ++++++++ tests/err_ignore_multitu_helper.c | 6 ++++++ 4 files changed, 48 insertions(+) create mode 100644 tests/err_ignore_multitu.c create mode 100644 tests/err_ignore_multitu.h create mode 100644 tests/err_ignore_multitu_helper.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ea8499..cfb46c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -282,6 +282,22 @@ foreach(_test IN LISTS AKERR_TESTS) endif() endforeach() +# The ignored-error slot is declared in the public header but must have one +# library definition. Compare its address from two translation units, and +# compile the consumer-facing test with all ordinary warnings enabled: a +# header-local TLS definition would both duplicate storage and warn when unused. +add_executable(test_err_ignore_multitu + tests/err_ignore_multitu.c + tests/err_ignore_multitu_helper.c) +target_include_directories(test_err_ignore_multitu + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/tests) +target_link_libraries(test_err_ignore_multitu PRIVATE akerror) +target_compile_options(test_err_ignore_multitu PRIVATE -Wall -Wextra -Werror) +if(AKERR_THREAD_SAFE) + target_link_libraries(test_err_ignore_multitu PRIVATE Threads::Threads) +endif() +add_test(NAME err_ignore_multitu COMMAND test_err_ignore_multitu) + # HANDLE_GROUP deliberately enters the next case label. Keep that public macro # compiling with the warning enabled, so a future macro edit cannot restore the # warning for consumers which adopt -Wextra. diff --git a/tests/err_ignore_multitu.c b/tests/err_ignore_multitu.c new file mode 100644 index 0000000..89bad2b --- /dev/null +++ b/tests/err_ignore_multitu.c @@ -0,0 +1,18 @@ +#include "akerror.h" +#include "err_ignore_multitu.h" +#include + +int main(void) +{ + akerr_ErrorContext **main_address = &__akerr_last_ignored; + akerr_ErrorContext **helper_address = akerr_multitu_snapshot_address(); + + if ( main_address != helper_address ) { + fprintf(stderr, + "CHECK FAILED: ignored-error storage differs between translation units\n"); + return 1; + } + + fprintf(stderr, "err_ignore_multitu ok\n"); + return 0; +} diff --git a/tests/err_ignore_multitu.h b/tests/err_ignore_multitu.h new file mode 100644 index 0000000..1b49529 --- /dev/null +++ b/tests/err_ignore_multitu.h @@ -0,0 +1,8 @@ +#ifndef AKERR_TEST_IGNORE_MULTITU_H +#define AKERR_TEST_IGNORE_MULTITU_H + +#include "akerror.h" + +akerr_ErrorContext **akerr_multitu_snapshot_address(void); + +#endif diff --git a/tests/err_ignore_multitu_helper.c b/tests/err_ignore_multitu_helper.c new file mode 100644 index 0000000..5af4c29 --- /dev/null +++ b/tests/err_ignore_multitu_helper.c @@ -0,0 +1,6 @@ +#include "err_ignore_multitu.h" + +akerr_ErrorContext **akerr_multitu_snapshot_address(void) +{ + return &__akerr_last_ignored; +}