[libcxx-commits] [libcxx] r352425 - [libc++] Use runtime rather then compile-time glibc version check

Petr Hosek via libcxx-commits libcxx-commits at lists.llvm.org
Mon Jan 28 12:39:50 PST 2019


Author: phosek
Date: Mon Jan 28 12:39:50 2019
New Revision: 352425

URL: http://llvm.org/viewvc/llvm-project?rev=352425&view=rev
Log:
[libc++] Use runtime rather then compile-time glibc version check

glibc supports versioning, so it's possible to build against older
version and run against newer version. This is sometimes relied on
in practice, e.g. in Fuchsia build we build against older sysroot
(equivalent to Ubuntu Trusty) to cover the broadest possible range
of host systems, but that doesn't necessarily match the system that
binary is going to run on which may have newer version, in which case
the compile test used in curr_symbol is going to fail. Using runtime
check is more reliable.

Differential Revision: https://reviews.llvm.org/D56702

Modified:
    libcxx/trunk/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp

Modified: libcxx/trunk/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp?rev=352425&r1=352424&r2=352425&view=diff
==============================================================================
--- libcxx/trunk/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp (original)
+++ libcxx/trunk/test/std/localization/locale.categories/category.monetary/locale.moneypunct.byname/curr_symbol.pass.cpp Mon Jan 28 12:39:50 2019
@@ -61,6 +61,20 @@ public:
         : std::moneypunct_byname<wchar_t, true>(nm, refs) {}
 };
 
+#if defined(_CS_GNU_LIBC_VERSION)
+static bool glibc_version_less_than(char const* version) {
+    std::string test_version = std::string("glibc ") + version;
+
+    size_t n = confstr(_CS_GNU_LIBC_VERSION, nullptr, (size_t)0);
+    char *current_version = new char[n];
+    confstr(_CS_GNU_LIBC_VERSION, current_version, n);
+
+    bool result = strverscmp(current_version, test_version.c_str()) < 0;
+    delete[] current_version;
+    return result;
+}
+#endif
+
 int main()
 {
     {
@@ -116,17 +130,14 @@ int main()
 
     {
         Fnf f(LOCALE_ru_RU_UTF_8, 1);
+#if defined(_CS_GNU_LIBC_VERSION)
         // GLIBC <= 2.23 uses currency_symbol="<U0440><U0443><U0431>"
         // GLIBC >= 2.24 uses currency_symbol="<U20BD>"
         // See also: http://www.fileformat.info/info/unicode/char/20bd/index.htm
-#if defined(TEST_GLIBC_PREREQ)
-    #if TEST_GLIBC_PREREQ(2, 24)
-        #define TEST_GLIBC_2_24_CURRENCY_SYMBOL
-    #endif
-#endif
-
-#if defined(TEST_GLIBC_2_24_CURRENCY_SYMBOL)
-        assert(f.curr_symbol() == " \u20BD");
+        if (!glibc_version_less_than("2.24"))
+          assert(f.curr_symbol() == " \u20BD");
+        else
+          assert(f.curr_symbol() == " \xD1\x80\xD1\x83\xD0\xB1");
 #else
         assert(f.curr_symbol() == " \xD1\x80\xD1\x83\xD0\xB1");
 #endif
@@ -137,8 +148,11 @@ int main()
     }
     {
         Fwf f(LOCALE_ru_RU_UTF_8, 1);
-#if defined(TEST_GLIBC_2_24_CURRENCY_SYMBOL)
-        assert(f.curr_symbol() == L" \u20BD");
+#if defined(_CS_GNU_LIBC_VERSION)
+        if (!glibc_version_less_than("2.24"))
+          assert(f.curr_symbol() == L" \u20BD");
+        else
+          assert(f.curr_symbol() == L" \x440\x443\x431");
 #else
         assert(f.curr_symbol() == L" \x440\x443\x431");
 #endif




More information about the libcxx-commits mailing list