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
diff --git a/include/regex b/include/regex
index 418cdaa..f851cb1 100644
--- a/include/regex
+++ b/include/regex
@@ -208,6 +208,8 @@
bool matched;
+ constexpr sub_match();
+
difference_type length() const;
operator string_type() const;
string_type str() const;
@@ -452,6 +454,8 @@
match_results& operator=(match_results&& m);
~match_results();
+ bool ready() const;
+
// size:
size_type size() const;
size_type max_size() const;
@@ -4684,6 +4688,9 @@
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;}
_LIBCPP_INLINE_VISIBILITY
@@ -5104,6 +5111,7 @@
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 @@
// 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 @@
__suffix_.matched = __m.suffix().matched;
if (!__no_update_pos)
__position_start_ = __prefix_.first;
+ __ready_ = __m.ready();
}
private:
@@ -5254,7 +5266,8 @@
__unmatched_(),
__prefix_(),
__suffix_(),
- __position_start_()
+ __position_start_(),
+ __ready_(false)
{
}
@@ -5274,6 +5287,7 @@
__suffix_ = __unmatched_;
if (!__no_update_pos)
__position_start_ = __prefix_.first;
+ __ready_ = true;
}
template <class _BidirectionalIterator, class _Allocator>
@@ -5379,6 +5393,7 @@
swap(__prefix_, __m.__prefix_);
swap(__suffix_, __m.__suffix_);
swap(__position_start_, __m.__position_start_);
+ swap(__ready_, __m.__ready_);
}
typedef match_results<const char*> cmatch;
@@ -5391,10 +5406,13 @@
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 <class _BidirectionalIterator, class _Allocator>
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 0000000..8f586c3
--- /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.
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// class match_results<BidirectionalIterator, Allocator>
+
+// bool ready() const;
+
+#include <regex>
+#include <cassert>
+
+void
+test1()
+{
+ std::match_results<const char*> 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<const char*> 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 0000000..451466a
--- /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.
+//
+//===----------------------------------------------------------------------===//
+
+// <regex>
+
+// template <class BidirectionalIterator> class sub_match;
+
+// constexpr sub_match();
+
+#include <regex>
+#include <cassert>
+
+int main()
+{
+ {
+ typedef char CharT;
+ typedef std::sub_match<const CharT*> SM;
+ SM sm;
+ assert(sm.matched == false);
+ }
+ {
+ typedef wchar_t CharT;
+ typedef std::sub_match<const CharT*> SM;
+ SM sm;
+ assert(sm.matched == false);
+ }
+}