diff options
-rw-r--r-- | libcxx/docs/DesignDocs/VisibilityMacros.rst | 11 | ||||
-rw-r--r-- | libcxx/include/__config | 6 | ||||
-rw-r--r-- | libcxx/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp | 5 |
3 files changed, 11 insertions, 11 deletions
diff --git a/libcxx/docs/DesignDocs/VisibilityMacros.rst b/libcxx/docs/DesignDocs/VisibilityMacros.rst index 67886e392ae..861cc04ac45 100644 --- a/libcxx/docs/DesignDocs/VisibilityMacros.rst +++ b/libcxx/docs/DesignDocs/VisibilityMacros.rst @@ -92,14 +92,13 @@ Visibility Macros On all other platforms, this macro has an empty definition. **_LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY** - Mark a member function of a class template as hidden and inline except when - building the libc++ library where it marks the symbol as being exported by - the library. + Mark a member function of a class template as visible and always inline. This + macro should only be applied to member functions of class templates that are + externally instantiated. It is important that these symbols are not marked + as hidden as that will prevent the dylib definition from being found. This macro is used to maintain ABI compatibility for symbols that have been - historically exported by the libc++ library but are now marked inline. It - should only be applied to member functions of class templates that are - externally instantiated. + historically exported by the libc++ library but are now marked inline. **_LIBCPP_EXCEPTION_ABI** Mark the member functions, typeinfo, and vtable of the type as being exported diff --git a/libcxx/include/__config b/libcxx/include/__config index 5b3c6947c5d..572b01520c7 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -609,11 +609,7 @@ namespace std { #endif #ifndef _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY -# ifdef _LIBCPP_BUILDING_LIBRARY -# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __attribute__((__visibility__("default"), __always_inline__)) -# else -# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY _LIBCPP_INLINE_VISIBILITY -# endif +# define _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY __attribute__((__visibility__("default"), __always_inline__)) #endif #ifndef _LIBCPP_PREFERRED_OVERLOAD diff --git a/libcxx/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp b/libcxx/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp index 011fd54f95b..0c6362d9686 100644 --- a/libcxx/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp +++ b/libcxx/test/std/strings/basic.string/string.cons/dtor_noexcept.pass.cpp @@ -27,6 +27,11 @@ struct some_alloc ~some_alloc() noexcept(false); }; +// Test that it's possible to take the address of basic_string's destructors +// by creating globals which will register their destructors with cxa_atexit. +std::string s; +std::wstring ws; + int main() { { |