aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-10-09 14:06:46 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2018-10-09 14:06:46 +0100
commit33b43b0d8cd2de722d177ef823930500948a7487 (patch)
treefe52c12f4745d6dc6e912bdf1181fc9c1d0aec2d
parentfe8a86e1f445c4f97c06ddc36ce68ca40627a1cc (diff)
downloadgcc-33b43b0d8cd2de722d177ef823930500948a7487.zip
gcc-33b43b0d8cd2de722d177ef823930500948a7487.tar.gz
gcc-33b43b0d8cd2de722d177ef823930500948a7487.tar.bz2
Define std::string and related typedefs outside __cxx11 namespace
The typedefs for common specializations of std::__cxx11::basic_string do not need to be in the std::__cxx11 namespace. Those typedefs are never used for linkage purposes so don't appear in mangled names, and so don't need to be distinct from the equivalent typedefs for the COW std::basic_string specializations. It is OK for the same typedef to refer to different types in different translation units. Defining them directly in namespace std improves diagnostics that use those typedefs. For example: error: could not convert '1' from 'int' to 'std::__cxx11::string' {aka 'std::__cxx11::basic_string<char>'} will now be printed as: error: could not convert '1' from 'int' to 'std::string' {aka 'std::__cxx11::basic_string<char>'} The precise type is still shown, but the typedef is not obfuscated with the inline namespace. * include/bits/stringfwd.h (string, wstring, u16string, u32string): Define typedefs outside of __cxx11 inline namespace. * python/libstdcxx/v6/printers.py (register_type_printers): Also register printers for typedefs in new location. From-SVN: r264958
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/include/bits/stringfwd.h4
-rw-r--r--libstdc++-v3/python/libstdcxx/v6/printers.py4
3 files changed, 12 insertions, 3 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 12dee3a..114a2ff 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,10 @@
+2018-10-09 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/bits/stringfwd.h (string, wstring, u16string, u32string):
+ Define typedefs outside of __cxx11 inline namespace.
+ * python/libstdcxx/v6/printers.py (register_type_printers): Also
+ register printers for typedefs in new location.
+
2018-10-08 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/87538
diff --git a/libstdc++-v3/include/bits/stringfwd.h b/libstdc++-v3/include/bits/stringfwd.h
index 15eb718..2b7f461 100644
--- a/libstdc++-v3/include/bits/stringfwd.h
+++ b/libstdc++-v3/include/bits/stringfwd.h
@@ -69,6 +69,8 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
typename _Alloc = allocator<_CharT> >
class basic_string;
+_GLIBCXX_END_NAMESPACE_CXX11
+
/// A string of @c char
typedef basic_string<char> string;
@@ -85,8 +87,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
typedef basic_string<char32_t> u32string;
#endif
-_GLIBCXX_END_NAMESPACE_CXX11
-
/** @} */
_GLIBCXX_END_NAMESPACE_VERSION
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index afe1b32..827c87b 100644
--- a/libstdc++-v3/python/libstdcxx/v6/printers.py
+++ b/libstdc++-v3/python/libstdcxx/v6/printers.py
@@ -1556,6 +1556,8 @@ def register_type_printers(obj):
# Add type printers for typedefs std::string, std::wstring etc.
for ch in ('', 'w', 'u16', 'u32'):
add_one_type_printer(obj, 'basic_string', ch + 'string')
+ add_one_type_printer(obj, '__cxx11::basic_string', ch + 'string')
+ # Typedefs for __cxx11::basic_string used to be in namespace __cxx11:
add_one_type_printer(obj, '__cxx11::basic_string',
'__cxx11::' + ch + 'string')
add_one_type_printer(obj, 'basic_string_view', ch + 'string_view')
@@ -1568,7 +1570,7 @@ def register_type_printers(obj):
for x in ('stringbuf', 'istringstream', 'ostringstream',
'stringstream'):
add_one_type_printer(obj, 'basic_' + x, ch + x)
- # <sstream> types are in __cxx11 namespace, but typedefs aren'x:
+ # <sstream> types are in __cxx11 namespace, but typedefs aren't:
add_one_type_printer(obj, '__cxx11::basic_' + x, ch + x)
# Add type printers for typedefs regex, wregex, cmatch, wcmatch etc.