|
Message-Id: <20230218013333.844224-1-i@maskray.me> Date: Fri, 17 Feb 2023 17:33:33 -0800 From: Fangrui Song <i@...kray.me> To: musl@...ts.openwall.com Cc: Fangrui Song <i@...kray.me> Subject: [PATCH] Use __builtin_FILE/__builtin_LINE if available C++ inline functions are requred to have exact same sequence of tokens in every translation unit, but __FILE__ and __LINE__ may expand to different tokens. The ODR violatioin is usually benign, but it can lead to errors when C++20 modules are used. echo 'import B; import C; int main() { foo(); }' > A.cc cat > B.ccm <<'eof' module; #include <assert.h> export module B; export inline void foo() { assert(1); } eof cat > C.ccm <<'eof' module; #include <assert.h> export module C; export inline void foo() { assert(1); } eof clang -std=c++20 --precompile B.ccm -o B.pcm clang -std=c++20 --precompile C.ccm -o C.pcm clang -std=c++20 -fprebuilt-module-path=. A.cc B.pcm C.pcm -o A /tmp/d/C.ccm:3:37: error: 'foo' has different definitions in different modules; definition in module 'C' first difference is function body export module C; export inline void foo() { assert(1); } ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ /tmp/d/B.ccm:3:37: note: but in 'B' found a different body export module B; export inline void foo() { assert(1); } ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ Fix this by preferring __builtin_FILE/__builtin_LINE which do not need preprocessing. --- include/assert.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/assert.h b/include/assert.h index d14ec94e..b209c2ae 100644 --- a/include/assert.h +++ b/include/assert.h @@ -4,6 +4,12 @@ #ifdef NDEBUG #define assert(x) (void)0 +#elif defined(__has_builtin) +#if __has_builtin(__builtin_FILE) +#define assert(x) ((void)((x) || (__assert_fail(#x, __builtin_FILE(), __builtin_LINE(), __func__),0))) +#else +#define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, __func__),0))) +#endif #else #define assert(x) ((void)((x) || (__assert_fail(#x, __FILE__, __LINE__, __func__),0))) #endif -- 2.39.GIT
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.