From 31aaf55f4cb0c69483b4198406c56b5c7c36fbd2 Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Wed, 8 Dec 2010 21:07:55 +0000 Subject: [PATCH] N3158 Missing preconditions for default-constructed match_result objects git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@121282 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/regex | 24 +++++++++-- .../re.results.state/ready.pass.cpp | 43 +++++++++++++++++++ .../re.submatch.members/default.pass.cpp | 33 ++++++++++++++ 3 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 test/re/re.results/re.results.state/ready.pass.cpp create mode 100644 test/re/re.submatch/re.submatch.members/default.pass.cpp diff --git a/include/regex b/include/regex index 418cdaa87..f851cb190 100644 --- a/include/regex +++ b/include/regex @@ -208,6 +208,8 @@ public: bool matched; + constexpr sub_match(); + difference_type length() const; operator string_type() const; string_type str() const; @@ -452,6 +454,8 @@ public: match_results& operator=(match_results&& m); ~match_results(); + bool ready() const; + // size: size_type size() const; size_type max_size() const; @@ -4683,6 +4687,9 @@ public: bool matched; + _LIBCPP_INLINE_VISIBILITY + /*constexpr*/ sub_match() : matched() {} + _LIBCPP_INLINE_VISIBILITY difference_type length() const {return matched ? _STD::distance(this->first, this->second) : 0;} @@ -5104,6 +5111,7 @@ private: value_type __unmatched_; value_type __prefix_; value_type __suffix_; + bool __ready_; public: _BidirectionalIterator __position_start_; typedef const value_type& const_reference; @@ -5123,6 +5131,9 @@ public: // match_results& operator=(match_results&& __m) = default; // ~match_results() = default; + _LIBCPP_INLINE_VISIBILITY + bool ready() const {return __ready_;} + // size: _LIBCPP_INLINE_VISIBILITY size_type size() const {return __matches_.size();} @@ -5224,6 +5235,7 @@ public: __suffix_.matched = __m.suffix().matched; if (!__no_update_pos) __position_start_ = __prefix_.first; + __ready_ = __m.ready(); } private: @@ -5254,7 +5266,8 @@ match_results<_BidirectionalIterator, _Allocator>::match_results( __unmatched_(), __prefix_(), __suffix_(), - __position_start_() + __position_start_(), + __ready_(false) { } @@ -5274,6 +5287,7 @@ match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s, __suffix_ = __unmatched_; if (!__no_update_pos) __position_start_ = __prefix_.first; + __ready_ = true; } template @@ -5379,6 +5393,7 @@ match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m) swap(__prefix_, __m.__prefix_); swap(__suffix_, __m.__suffix_); swap(__position_start_, __m.__position_start_); + swap(__ready_, __m.__ready_); } typedef match_results cmatch; @@ -5391,10 +5406,13 @@ bool operator==(const match_results<_BidirectionalIterator, _Allocator>& __x, const match_results<_BidirectionalIterator, _Allocator>& __y) { + if (__x.__ready_ != __y.__ready_) + return false; + if (!__x.__ready_) + return true; return __x.__matches_ == __y.__matches_ && __x.__prefix_ == __y.__prefix_ && - __x.__suffix_ == __y.__suffix_ && - __x.__position_start_ == __y.__position_start_; + __x.__suffix_ == __y.__suffix_; } template diff --git a/test/re/re.results/re.results.state/ready.pass.cpp b/test/re/re.results/re.results.state/ready.pass.cpp new file mode 100644 index 000000000..8f586c3f3 --- /dev/null +++ b/test/re/re.results/re.results.state/ready.pass.cpp @@ -0,0 +1,43 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// class match_results + +// bool ready() const; + +#include +#include + +void +test1() +{ + std::match_results m; + const char s[] = "abcdefghijk"; + assert(m.ready() == false); + std::regex_search(s, m, std::regex("cd((e)fg)hi")); + assert(m.ready() == true); +} + +void +test2() +{ + std::match_results m; + const char s[] = "abcdefghijk"; + assert(m.ready() == false); + std::regex_search(s, m, std::regex("z")); + assert(m.ready() == true); +} + +int main() +{ + test1(); + test2(); +} diff --git a/test/re/re.submatch/re.submatch.members/default.pass.cpp b/test/re/re.submatch/re.submatch.members/default.pass.cpp new file mode 100644 index 000000000..451466af8 --- /dev/null +++ b/test/re/re.submatch/re.submatch.members/default.pass.cpp @@ -0,0 +1,33 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// + +// template class sub_match; + +// constexpr sub_match(); + +#include +#include + +int main() +{ + { + typedef char CharT; + typedef std::sub_match SM; + SM sm; + assert(sm.matched == false); + } + { + typedef wchar_t CharT; + typedef std::sub_match SM; + SM sm; + assert(sm.matched == false); + } +}