diff options
author | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-02-17 13:16:31 +0000 |
---|---|---|
committer | Daniel Sanders <daniel.sanders@imgtec.com> | 2016-02-17 13:16:31 +0000 |
commit | 4788179a2cbb8fceda25751b2bdfc4f3ae2d13d6 (patch) | |
tree | bf10154aa22255637de4de34928e50d68448af6e /libcxx/include/regex | |
parent | 124be56bcc0d8e9c770fa70a392560bebea9478c (diff) | |
download | bcm5719-llvm-4788179a2cbb8fceda25751b2bdfc4f3ae2d13d6.tar.gz bcm5719-llvm-4788179a2cbb8fceda25751b2bdfc4f3ae2d13d6.zip |
[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
llvm-svn: 261088
Diffstat (limited to 'libcxx/include/regex')
-rw-r--r-- | libcxx/include/regex | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/libcxx/include/regex b/libcxx/include/regex index f1f3264d320..1139d8fb2a9 100644 --- a/libcxx/include/regex +++ b/libcxx/include/regex @@ -976,7 +976,12 @@ public: 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_; |