Merging r261088:
------------------------------------------------------------------------
r261088 | dsanders | 2016-02-17 13:16:31 +0000 (Wed, 17 Feb 2016) | 21 lines

[libcxx] Fix definition of regex_traits::__regex_word on big-endian glibc systems

Summary:
On glibc, the bits used for the various character classes is endian dependant
(see _ISbit() in ctypes.h) but __regex_word does not account for this and uses
a spare bit that isn't spare on big-endian. On big-endian, it overlaps with the
bit for graphic characters which causes '-', '@', etc. to be considered a word
character.

Fixed this by defining the value using _ISbit(15) on MIPS glibc systems. We've
restricted this to MIPS for now to avoid the risk of introducing failures in
other targets.

Fixes PR26476.

Reviewers: hans, mclow.lists

Subscribers: dsanders, cfe-commits

Differential Revision: http://reviews.llvm.org/D17132

------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/branches/release_38@261097 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/regex b/include/regex
index f1f3264..1139d8f 100644
--- a/include/regex
+++ b/include/regex
@@ -976,7 +976,12 @@
     typedef locale                  locale_type;
     typedef ctype_base::mask        char_class_type;
 
+#if defined(__mips__) && defined(__GLIBC__)
+    static const char_class_type __regex_word = static_cast<char_class_type>(_ISbit(15));
+#else
     static const char_class_type __regex_word = 0x80;
+#endif
+
 private:
     locale __loc_;
     const ctype<char_type>* __ct_;