Define std::string and related typedefs outside __cxx11 namespace
authorJonathan Wakely <jwakely@redhat.com>
Tue, 9 Oct 2018 13:06:46 +0000 (14:06 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 9 Oct 2018 13:06:46 +0000 (14:06 +0100)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stringfwd.h
libstdc++-v3/python/libstdcxx/v6/printers.py

index 12dee3a273c7fef5ea2723cb9a00abe2d11c2bf1..114a2ffb66c712d4f88538ff704a35961a4b07ae 100644 (file)
@@ -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
index 15eb7183633b503d0018cca9d8549d8af195e372..2b7f4612cbcc93bd9015f87a68d98867836eeb3e 100644 (file)
@@ -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
index afe1b325d87830847e514fcd8c99e4c98c263b3b..827c87b70ea50f98d58892b7d953198f2ddcd93b 100644 (file)
@@ -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.