PR libstdc++/31413 fix test failure on Debian systems
authorJonathan Wakely <jwakely@redhat.com>
Wed, 29 Aug 2018 10:05:55 +0000 (11:05 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 29 Aug 2018 10:05:55 +0000 (11:05 +0100)
Debian uses a different D_FMT string for the zh_TW.UTF-8 locale, which
caused this test to fail. Try to detect the Debian format and adjust
the input being tested.

PR libstdc++/31413
* testsuite/22_locale/time_get/get_date/wchar_t/4.cc: Check D_FMT
string for alternative format.

From-SVN: r263948

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/22_locale/time_get/get_date/wchar_t/4.cc

index b6ae0e5ffab6773a60b9c98d9ab106745fa065af..477784624b61441e0477cde1a3a87cb98c8dfddf 100644 (file)
@@ -1,3 +1,9 @@
+2018-08-29  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/31413
+       * testsuite/22_locale/time_get/get_date/wchar_t/4.cc: Check D_FMT
+       string for alternative format.
+
 2018-08-28  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/87116
index 21e51d250ad20fc911e3317faeab9187c2d88fe0..a532c93d4a14c793f7ede8a3d67c5b1a4ced0110 100644 (file)
@@ -25,6 +25,8 @@
 #include <sstream>
 #include <testsuite_hooks.h>
 
+static bool debian_date_format();
+
 void test01()
 {
   using namespace std;
@@ -46,7 +48,7 @@ void test01()
                           0x5e74, L'1', L'2', 0x6708, L'1', L'7',
                           0x65e5 , 0x0 };
 
-  iss.str(wstr);
+  iss.str(debian_date_format() ? wstr+2 : wstr);
   iterator_type is_it01(iss);
   tm time01;
   tim_get.get_date(is_it01, end, iss, errorstate, &time01);
@@ -56,6 +58,26 @@ void test01()
   VERIFY( time01.tm_year == 103 );
 }
 
+#include <locale.h>
+#if __has_include(<langinfo.h>)
+# include <langinfo.h>
+#endif
+
+static bool debian_date_format()
+{
+#ifdef D_FMT
+  if (setlocale(LC_TIME, "zh_TW.UTF-8") != NULL)
+  {
+    // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=31413
+    // and https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71641#c2
+    if (*nl_langinfo(D_FMT) == '%')
+      return true;
+    setlocale(LC_TIME, "C");
+  }
+#endif
+  return false;
+}
+
 int main()
 {
   test01();