From f2b03facd9820d4f405cec00b89ba6af3559c3e9 Mon Sep 17 00:00:00 2001 From: Daniela Engert Date: Sat, 3 Jul 2021 14:21:54 +0000 Subject: [PATCH] Include test sources to pick up functions and classes from the module rather than from the non-modular library which is baked into the `test-main` library. (#2356) This averts linker problems: - strong ownership model: missing linker symbols - weak ownership model: duplicate linker symbols Simplify `gtest-extra.cc` while at it. --- test/CMakeLists.txt | 4 ++-- test/gtest-extra.cc | 7 +++---- test/module-test.cc | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 720bea19..0e8c59e2 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -41,7 +41,7 @@ function(add_fmt_test name) set(PEDANTIC_COMPILE_FLAGS ${PEDANTIC_COMPILE_FLAGS} -Wno-weak-vtables) endif () elseif (ADD_FMT_TEST_MODULE) - set(libs test-main test-module) + set(libs gtest test-module) set_source_files_properties(${name}.cc PROPERTIES OBJECT_DEPENDS test-module) else () set(libs test-main fmt) @@ -97,7 +97,7 @@ if (FMT_CAN_MODULE) $) enable_module(test-module) - add_fmt_test(module-test MODULE) + add_fmt_test(module-test MODULE test-main.cc) if (MSVC) target_compile_options(test-module PRIVATE /utf-8 /Zc:__cplusplus /Zc:externConstexpr /Zc:inline) diff --git a/test/gtest-extra.cc b/test/gtest-extra.cc index dc542184..1d48a173 100644 --- a/test/gtest-extra.cc +++ b/test/gtest-extra.cc @@ -32,11 +32,10 @@ output_redirect::~output_redirect() FMT_NOEXCEPT { } void output_redirect::flush() { -# if EOF != -1 -# error "FMT_RETRY assumes return value of -1 indicating failure" -# endif int result = 0; - FMT_RETRY(result, fflush(file_)); + do { + result = fflush(file_); + } while (result == EOF && errno == EINTR); if (result != 0) throw fmt::system_error(errno, "cannot flush stream"); } diff --git a/test/module-test.cc b/test/module-test.cc index 69b6099a..5d050406 100644 --- a/test/module-test.cc +++ b/test/module-test.cc @@ -35,18 +35,30 @@ # define FMT_USE_FCNTL 0 #endif #define FMT_NOEXCEPT noexcept +#if defined(_WIN32) && !defined(__MINGW32__) +# define FMT_POSIX(call) _##call +#else +# define FMT_POSIX(call) call +#endif +#define FMT_OS_H_ // don't pull in os.h directly or indirectly import fmt; // check for macros leaking from BMI static bool macro_leaked = -#if defined(FMT_CORE_H_) || defined(FMT_FORMAT_H) +#if defined(FMT_CORE_H_) || defined(FMT_FORMAT_H_) true; #else false; #endif -#include "gtest-extra.h" +// Include sources to pick up functions and classes from the module rather than +// from the non-modular library which is baked into the 'test-main' library. +// This averts linker problems: +// - strong ownership model: missing linker symbols +// - weak ownership model: duplicate linker symbols +#include "gtest-extra.cc" +#include "util.cc" // an implicitly exported namespace must be visible [module.interface]/2.2 TEST(module_test, namespace) {