diff mbox series

PR libstdc++/87061 remove pmr type aliases for COW strings

Message ID 20180822225427.GA17161@redhat.com
State New
Headers show
Series PR libstdc++/87061 remove pmr type aliases for COW strings | expand

Commit Message

Jonathan Wakely Aug. 22, 2018, 10:54 p.m. UTC
The pmr aliases for basic_string and match_results are incompatible with
the gcc4-compatible ABI because the Copy-On-Write basic_string class
doesn't support C++11 allocators.

	PR libstdc++/87061
	* include/experimental/regex [!_GLIBCXX_USE_CXX11_ABI]
	(experimental::pmr::match_results, experimental::pmr::cmatch)
	(experimental::pmr::smatch, experimental::pmr::wcmatch)
	(experimental::pmr::wsmatch): Do not declare for gcc4-compatible ABI,
	because COW strings don't support C++11 allocator model.
	* include/experimental/string [!_GLIBCXX_USE_CXX11_ABI]
	(experimental::pmr::basic_string, experimental::pmr::string)
	(experimental::pmr::u16string, experimental::pmr::u32string)
	(experimental::pmr::wstring): Likewise.
	* include/std/regex [!_GLIBCXX_USE_CXX11_ABI] (pmr::match_results)
	(pmr::cmatch, pmr::smatch, pmr::wcmatch, pmr::wsmatch): Likewise.
	* include/std/string [!_GLIBCXX_USE_CXX11_ABI] (pmr::basic_string)
	(pmr::string, pmr::u16string, pmr::u32string, pmr::wstring): Likewise.
	* testsuite/21_strings/basic_string/types/pmr_typedefs.cc: Require
	cxx11-abi.
	* testsuite/28_regex/match_results/pmr_typedefs.cc: Likewise.

Tested x86_64-linux, committed to trunk.
commit 134070cf5f9dba6cb655160c551e617d2378cfb4
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Wed Aug 22 23:39:31 2018 +0100

    PR libstdc++/87061 remove pmr type aliases for COW strings
    
    The pmr aliases for basic_string and match_results are incompatible with
    the gcc4-compatible ABI because the Copy-On-Write basic_string class
    doesn't support C++11 allocators.
    
            PR libstdc++/87061
            * include/experimental/regex [!_GLIBCXX_USE_CXX11_ABI]
            (experimental::pmr::match_results, experimental::pmr::cmatch)
            (experimental::pmr::smatch, experimental::pmr::wcmatch)
            (experimental::pmr::wsmatch): Do not declare for gcc4-compatible ABI,
            because COW strings don't support C++11 allocator model.
            * include/experimental/string [!_GLIBCXX_USE_CXX11_ABI]
            (experimental::pmr::basic_string, experimental::pmr::string)
            (experimental::pmr::u16string, experimental::pmr::u32string)
            (experimental::pmr::wstring): Likewise.
            * include/std/regex [!_GLIBCXX_USE_CXX11_ABI] (pmr::match_results)
            (pmr::cmatch, pmr::smatch, pmr::wcmatch, pmr::wsmatch): Likewise.
            * include/std/string [!_GLIBCXX_USE_CXX11_ABI] (pmr::basic_string)
            (pmr::string, pmr::u16string, pmr::u32string, pmr::wstring): Likewise.
            * testsuite/21_strings/basic_string/types/pmr_typedefs.cc: Require
            cxx11-abi.
            * testsuite/28_regex/match_results/pmr_typedefs.cc: Likewise.
diff mbox series

Patch

diff --git a/libstdc++-v3/include/experimental/regex b/libstdc++-v3/include/experimental/regex
index eb2af151245..633b396b312 100644
--- a/libstdc++-v3/include/experimental/regex
+++ b/libstdc++-v3/include/experimental/regex
@@ -44,6 +44,7 @@  namespace experimental
 {
 inline namespace fundamentals_v2
 {
+#if _GLIBCXX_USE_CXX11_ABI
 namespace pmr
 {
   template<typename _BidirectionalIterator>
@@ -57,7 +58,7 @@  namespace pmr
   typedef match_results<wstring::const_iterator> wsmatch;
 
 } // namespace pmr
-
+#endif
 } // namespace fundamentals_v2
 } // namespace experimental
 _GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/include/experimental/string b/libstdc++-v3/include/experimental/string
index f101255d641..5a96bf78d73 100644
--- a/libstdc++-v3/include/experimental/string
+++ b/libstdc++-v3/include/experimental/string
@@ -62,6 +62,7 @@  inline namespace fundamentals_v2
 		   __cont.end());
     }
 
+#if _GLIBCXX_USE_CXX11_ABI
   namespace pmr
   {
     // basic_string using polymorphic allocator in namespace pmr
@@ -77,6 +78,7 @@  inline namespace fundamentals_v2
     typedef basic_string<wchar_t> wstring;
 
   } // namespace pmr
+#endif
 } // namespace fundamentals_v2
 } // namespace experimental
 
diff --git a/libstdc++-v3/include/std/regex b/libstdc++-v3/include/std/regex
index f0dfa3f68ab..fd155658353 100644
--- a/libstdc++-v3/include/std/regex
+++ b/libstdc++-v3/include/std/regex
@@ -62,7 +62,7 @@ 
 #include <bits/regex.h>
 #include <bits/regex_executor.h>
 
-#if __cplusplus >= 201703L
+#if __cplusplus >= 201703L && _GLIBCXX_USE_CXX11_ABI
 #include <memory_resource>
 namespace std _GLIBCXX_VISIBILITY(default)
 {
diff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string
index d3cc03aa179..dd60df2ba6e 100644
--- a/libstdc++-v3/include/std/string
+++ b/libstdc++-v3/include/std/string
@@ -52,7 +52,7 @@ 
 #include <bits/basic_string.h>
 #include <bits/basic_string.tcc>
 
-#if __cplusplus >= 201703L
+#if __cplusplus >= 201703L && _GLIBCXX_USE_CXX11_ABI
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
diff --git a/libstdc++-v3/testsuite/21_strings/basic_string/types/pmr_typedefs.cc b/libstdc++-v3/testsuite/21_strings/basic_string/types/pmr_typedefs.cc
index d20fc42901e..23956673792 100644
--- a/libstdc++-v3/testsuite/21_strings/basic_string/types/pmr_typedefs.cc
+++ b/libstdc++-v3/testsuite/21_strings/basic_string/types/pmr_typedefs.cc
@@ -17,6 +17,7 @@ 
 
 // { dg-options "-std=gnu++17" }
 // { dg-do compile { target c++17 } }
+// { dg-require-effective-target cxx11-abi }
 
 #include <string>
 #include <memory_resource>
diff --git a/libstdc++-v3/testsuite/28_regex/match_results/pmr_typedefs.cc b/libstdc++-v3/testsuite/28_regex/match_results/pmr_typedefs.cc
index 23aef39caf3..d97fcfeb75e 100644
--- a/libstdc++-v3/testsuite/28_regex/match_results/pmr_typedefs.cc
+++ b/libstdc++-v3/testsuite/28_regex/match_results/pmr_typedefs.cc
@@ -17,6 +17,7 @@ 
 
 // { dg-options "-std=gnu++17" }
 // { dg-do compile { target c++17 } }
+// { dg-require-effective-target cxx11-abi }
 
 #include <regex>
 #include <memory_resource>