[libcxx] r281673 - [libc++] Fix and document visibility attributes for Clang, GCC and Windows.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 7 15:34:44 PDT 2016


This caused https://llvm.org/bugs/show_bug.cgi?id=30642

On Thu, Sep 15, 2016 at 6:27 PM, Eric Fiselier via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: ericwf
> Date: Thu Sep 15 17:27:07 2016
> New Revision: 281673
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281673&view=rev
> Log:
> [libc++] Fix and document visibility attributes for Clang, GCC and Windows.
>
> Summary:
> This patch fixes a number of problems with the visibility macros across
> GCC (on Unix) and Windows (DLL import/export semantics). All of the
> visibility macros are now documented under `DesignDocs/VisibilityMacros.rst`.
> Now I'll no longer forget the subtleties of each!
>
> This patch adds two new visibility macros:
>
> * `_LIBCPP_ENUM_VIS` for controlling the typeinfo of enum types. Only
> Clang supports this.
> * `_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS` for redefining visibility on
> explicit instantiation declarations. Clang and Windows require this.
>
> After applying this patch GCC only emits one -Wattribute warning opposed
> to 30+.
>
>
> Reviewers: mclow.lists, EricWF
>
> Subscribers: beanz, mgorny, cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D24602
>
> Added:
>     libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst
> Modified:
>     libcxx/trunk/CMakeLists.txt
>     libcxx/trunk/docs/index.rst
>     libcxx/trunk/include/__config
>     libcxx/trunk/include/__locale
>     libcxx/trunk/include/__string
>     libcxx/trunk/include/experimental/filesystem
>     libcxx/trunk/include/istream
>     libcxx/trunk/include/locale
>     libcxx/trunk/include/ostream
>     libcxx/trunk/include/streambuf
>     libcxx/trunk/include/string
>     libcxx/trunk/include/vector
>
> Modified: libcxx/trunk/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/
> CMakeLists.txt?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/CMakeLists.txt (original)
> +++ libcxx/trunk/CMakeLists.txt Thu Sep 15 17:27:07 2016
> @@ -342,7 +342,6 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "
>          -Wno-covered-switch-default)
>  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
>      add_compile_flags_if_supported(
> -        -Wno-attributes # FIXME: Fix -Wattribute warnings.
>          -Wno-literal-suffix
>          -Wno-c++14-compat)
>  endif()
>
> Added: libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/
> DesignDocs/VisibilityMacros.rst?rev=281673&view=auto
> ============================================================
> ==================
> --- libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst (added)
> +++ libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst Thu Sep 15 17:27:07
> 2016
> @@ -0,0 +1,85 @@
> +========================
> +Symbol Visibility Macros
> +========================
> +
> +.. contents::
> +   :local:
> +
> +Overview
> +========
> +
> +Libc++ uses various "visibility" macros in order to provide a stable ABI
> in
> +both the library and the headers. These macros work by changing the
> +visibility and inlining characteristics of the symbols they are applied
> to.
> +
> +Visibility Macros
> +=================
> +
> +**_LIBCPP_HIDDEN**
> +  Mark a symbol as hidden so it will not be exported from shared
> libraries.
> +
> +**_LIBCPP_FUNC_VIS**
> +  Mark a symbol as being exported by the libc++ library. This attribute
> must
> +  be applied to the declaration of all functions exported by the libc++
> dylib.
> +
> +**_LIBCPP_INLINE_VISIBILITY**
> +  Mark a function as hidden and force inlining whenever possible.
> +
> +**_LIBCPP_ALWAYS_INLINE**
> +  A synonym for `_LIBCPP_INLINE_VISIBILITY`
> +
> +**_LIBCPP_TYPE_VIS**
> +  Mark a type's typeinfo and vtable as having default visibility.
> +  `_LIBCPP_TYPE_VIS`. This macro has no effect on the visibility of the
> +  type's member functions. This attribute cannot be used on class
> templates.
> +
> +  **GCC Behavior**: GCC does not support Clang's `type_visibility(...)`
> +  attribute. With GCC the `visibility(...)` attribute is used and member
> +  functions are affected.
> +
> +**_LIBCPP_TYPE_VIS_ONLY**
> +  The same as `_LIBCPP_TYPE_VIS` except that it may be applied to
> templates.
> +
> +  **Windows Behavior**: DLLs do not support dllimport/export on class
> templates.
> +  The macro has an empty definition on this platform.
> +
> +  Note: This macro should be renamed `_LIBCPP_TEMPLATE_TYPE_VIS`.
> +
> +**_LIBCPP_ENUM_VIS**
> +  Mark the typeinfo of an enum as having default visibility. This
> attribute
> +  should be applied to all enum declarations.
> +
> +  **Windows Behavior**: DLLs do not support importing or exporting
> enumeration
> +  typeinfo. The macro has an empty definition on this platform.
> +
> +  **GCC Behavior**: GCC un-hides the typeinfo for enumerations by
> default, even
> +  if `-fvisibility=hidden` is specified. Additionally applying a
> visibility
> +  attribute to an enum class results in a warning. The macro has an empty
> +  definition with GCC.
> +
> +**_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS**
> +  Mark the member functions, typeinfo, and vtable of the type named in
> +  a `_LIBCPP_EXTERN_TEMPLATE` declaration as being exported by the libc++
> library.
> +  This attribute must be specified on all extern class template
> declarations.
> +
> +  This macro is used to override the `_LIBCPP_TYPE_VIS_ONLY` attribute
> +  specified on the primary template and to export the member functions
> produced
> +  by the explicit instantiation in the dylib.
> +
> +  **GCC Behavior**: GCC ignores visibility attributes applied the type in
> +  extern template declarations and applying an attribute results in a
> warning.
> +  However since `_LIBCPP_TYPE_VIS_ONLY` is the same as `_LIBCPP_TYPE_VIS`
> the
> +  visibility is already correct. The macro has an empty definition with
> GCC.
> +
> +**_LIBCPP_EXCEPTION_ABI**
> +  Mark the member functions, typeinfo, and vtable of the type as being
> exported
> +  by the libc++ library. This macro must be applied to all *exception
> types*.
> +  Exception types must be defined directly in namespace `std` and not the
> +  versioning namespace.
> +
> +Links
> +=====
> +
> +* `[cfe-dev] Visibility in libc++ - 1 <http://lists.llvm.org/
> pipermail/cfe-dev/2013-July/030610.html>`_
> +* `[cfe-dev] Visibility in libc++ - 2 <http://lists.llvm.org/
> pipermail/cfe-dev/2013-August/031195.html>`_
> +* `[libcxx] Visibility fixes for Windows <http://lists.llvm.org/
> pipermail/cfe-commits/Week-of-Mon-20130805/085461.html>`_
>
> Modified: libcxx/trunk/docs/index.rst
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/
> index.rst?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/docs/index.rst (original)
> +++ libcxx/trunk/docs/index.rst Thu Sep 15 17:27:07 2016
> @@ -129,6 +129,7 @@ Design Documents
>
>     DesignDocs/CapturingConfigInfo
>     DesignDocs/ABIVersioning
> +   DesignDocs/VisibilityMacros
>
>
>  * `<atomic> design <http://libcxx.llvm.org/atomic_design.html>`_
>
> Modified: libcxx/trunk/include/__config
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_
> _config?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/__config (original)
> +++ libcxx/trunk/include/__config Thu Sep 15 17:27:07 2016
> @@ -202,90 +202,6 @@
>  #define _LIBCPP_NO_CFI
>  #endif
>
> -#ifdef _WIN32
> -
> -// only really useful for a DLL
> -#ifdef _LIBCPP_DLL // this should be a compiler builtin define ideally...
> -# ifdef cxx_EXPORTS
> -#  define _LIBCPP_HIDDEN
> -#  define _LIBCPP_FUNC_VIS __declspec(dllexport)
> -#  define _LIBCPP_TYPE_VIS __declspec(dllexport)
> -# else
> -#  define _LIBCPP_HIDDEN
> -#  define _LIBCPP_FUNC_VIS __declspec(dllimport)
> -#  define _LIBCPP_TYPE_VIS __declspec(dllimport)
> -# endif
> -#else
> -# define _LIBCPP_HIDDEN
> -# define _LIBCPP_FUNC_VIS
> -# define _LIBCPP_TYPE_VIS
> -#endif
> -
> -#define _LIBCPP_TYPE_VIS_ONLY
> -#define _LIBCPP_FUNC_VIS_ONLY
> -
> -#ifndef _LIBCPP_INLINE_VISIBILITY
> -# ifdef _LIBCPP_MSVC
> -#  define _LIBCPP_INLINE_VISIBILITY __forceinline
> -# else // MinGW GCC and Clang
> -#  define _LIBCPP_INLINE_VISIBILITY __attribute__ ((__always_inline__))
> -# endif
> -#endif
> -
> -#ifndef _LIBCPP_EXCEPTION_ABI
> -#define _LIBCPP_EXCEPTION_ABI _LIBCPP_TYPE_VIS
> -#endif
> -
> -#ifndef _LIBCPP_ALWAYS_INLINE
> -# ifdef _LIBCPP_MSVC
> -#  define _LIBCPP_ALWAYS_INLINE __forceinline
> -# endif
> -#endif
> -
> -#endif // _WIN32
> -
> -#ifndef _LIBCPP_HIDDEN
> -#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
> -#endif
> -
> -#ifndef _LIBCPP_FUNC_VIS
> -#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
> -#endif
> -
> -#ifndef _LIBCPP_TYPE_VIS
> -#  if __has_attribute(__type_visibility__)
> -#    define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("
> default")))
> -#  else
> -#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
> -#  endif
> -#endif
> -
> -#ifndef _LIBCPP_PREFERRED_OVERLOAD
> -#  if __has_attribute(__enable_if__)
> -#    define _LIBCPP_PREFERRED_OVERLOAD __attribute__
> ((__enable_if__(true, "")))
> -#  endif
> -#endif
> -
> -#ifndef _LIBCPP_TYPE_VIS_ONLY
> -# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
> -#endif
> -
> -#ifndef _LIBCPP_FUNC_VIS_ONLY
> -# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
> -#endif
> -
> -#ifndef _LIBCPP_INLINE_VISIBILITY
> -#define _LIBCPP_INLINE_VISIBILITY __attribute__
> ((__visibility__("hidden"), __always_inline__))
> -#endif
> -
> -#ifndef _LIBCPP_EXCEPTION_ABI
> -#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
> -#endif
> -
> -#ifndef _LIBCPP_ALWAYS_INLINE
> -#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"),
> __always_inline__))
> -#endif
> -
>  #if defined(__clang__)
>
>  // _LIBCPP_ALTERNATE_STRING_LAYOUT is an old name for
> @@ -581,8 +497,6 @@ using namespace _LIBCPP_NAMESPACE __attr
>  #define _ALIGNAS(x) __declspec(align(x))
>  #define _LIBCPP_HAS_NO_VARIADICS
>
> -
> -
>  #define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
>  #define _LIBCPP_END_NAMESPACE_STD  }
>  #define _VSTD std
> @@ -628,6 +542,86 @@ namespace std {
>
>  #endif // __clang__ || __GNUC__ || _MSC_VER || __IBMCPP__
>
> +
> +#ifdef _WIN32
> +// only really useful for a DLL. _LIBCPP_DLL should be a compiler builtin
> define ideally...
> +#if defined(_LIBCPP_DLL) && defined(cxx_EXPORTS)
> +# define _LIBCPP_DLL_VIS __declspec(dllexport)
> +#elif defined(_LIBCPP_DLL)
> +# define _LIBCPP_DLL_VIS __declspec(dllimport)
> +#else
> +# define _LIBCPP_DLL_VIS
> +#endif
> +#define _LIBCPP_TYPE_VIS            _LIBCPP_DLL_VIS
> +#define _LIBCPP_FUNC_VIS            _LIBCPP_DLL_VIS
> +#define _LIBCPP_EXCEPTION_ABI       _LIBCPP_DLL_VIS
> +#define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
> +#define _LIBCPP_HIDDEN
> +#define _LIBCPP_TYPE_VIS_ONLY
> +#define _LIBCPP_FUNC_VIS_ONLY
> +#define _LIBCPP_ENUM_VIS
> +#define _LIBCPP_INLINE_VISIBILITY __forceinline
> +#define _LIBCPP_ALWAYS_INLINE     __forceinline
> +#endif // _WIN32
> +
> +#ifndef _LIBCPP_HIDDEN
> +#define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
> +#endif
> +
> +#ifndef _LIBCPP_FUNC_VIS
> +#define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
> +#endif
> +
> +#ifndef _LIBCPP_TYPE_VIS
> +#  if __has_attribute(__type_visibility__)
> +#    define _LIBCPP_TYPE_VIS __attribute__ ((__type_visibility__("
> default")))
> +#  else
> +#    define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
> +#  endif
> +#endif
> +
> +#ifndef _LIBCPP_TYPE_VIS_ONLY
> +# define _LIBCPP_TYPE_VIS_ONLY _LIBCPP_TYPE_VIS
> +#endif
> +
> +#ifndef _LIBCPP_FUNC_VIS_ONLY
> +# define _LIBCPP_FUNC_VIS_ONLY _LIBCPP_FUNC_VIS
> +#endif
> +
> +#ifndef _LIBCPP_EXCEPTION_ABI
> +#define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
> +#endif
> +
> +#ifndef _LIBCPP_ENUM_VIS
> +#  if __has_attribute(__type_visibility__)
> +#    define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("
> default")))
> +#  else
> +#    define _LIBCPP_ENUM_VIS
> +#  endif
> +#endif
> +
> +#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> +#  if __has_attribute(__type_visibility__)
> +#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__
> ((__visibility__("default")))
> +#  else
> +#    define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> +#  endif
> +#endif
> +
> +#ifndef _LIBCPP_INLINE_VISIBILITY
> +#define _LIBCPP_INLINE_VISIBILITY __attribute__
> ((__visibility__("hidden"), __always_inline__))
> +#endif
> +
> +#ifndef _LIBCPP_ALWAYS_INLINE
> +#define _LIBCPP_ALWAYS_INLINE  __attribute__ ((__visibility__("hidden"),
> __always_inline__))
> +#endif
> +
> +#ifndef _LIBCPP_PREFERRED_OVERLOAD
> +#  if __has_attribute(__enable_if__)
> +#    define _LIBCPP_PREFERRED_OVERLOAD __attribute__
> ((__enable_if__(true, "")))
> +#  endif
> +#endif
> +
>  #ifndef _LIBCPP_HAS_NO_NOEXCEPT
>  #  define _NOEXCEPT noexcept
>  #  define _NOEXCEPT_(x) noexcept(x)
> @@ -716,7 +710,7 @@ template <unsigned> struct __static_asse
>      _LIBCPP_ALWAYS_INLINE operator int() const {return __v_;} \
>      };
>  #else  // _LIBCPP_HAS_NO_STRONG_ENUMS
> -#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_TYPE_VIS_ONLY x
> +#define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x
>  #define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
>  #endif  // _LIBCPP_HAS_NO_STRONG_ENUMS
>
>
> Modified: libcxx/trunk/include/__locale
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_
> _locale?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/__locale (original)
> +++ libcxx/trunk/include/__locale Thu Sep 15 17:27:07 2016
> @@ -269,8 +269,8 @@ collate<_CharT>::do_hash(const char_type
>      return static_cast<long>(__h);
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> collate<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> collate<wchar_t>)
>
>  // template <class CharT> class collate_byname;
>
> @@ -1178,10 +1178,10 @@ codecvt_byname<_InternT, _ExternT, _Stat
>  {
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char,
> char, mbstate_t>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<wchar_t,
> char, mbstate_t>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char16_t,
> char, mbstate_t>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char32_t,
> char, mbstate_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> codecvt_byname<char, char, mbstate_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> codecvt_byname<wchar_t, char, mbstate_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> codecvt_byname<char16_t, char, mbstate_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> codecvt_byname<char32_t, char, mbstate_t>)
>
>  _LIBCPP_NORETURN _LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
>
>
> Modified: libcxx/trunk/include/__string
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/_
> _string?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/__string (original)
> +++ libcxx/trunk/include/__string Thu Sep 15 17:27:07 2016
> @@ -701,7 +701,8 @@ __str_find_last_not_of(const _CharT *__p
>  }
>
>  template<class _Ptr>
> -size_t _LIBCPP_INLINE_VISIBILITY __do_string_hash(_Ptr __p, _Ptr __e)
> +inline _LIBCPP_INLINE_VISIBILITY
> +size_t __do_string_hash(_Ptr __p, _Ptr __e)
>  {
>      typedef typename iterator_traits<_Ptr>::value_type value_type;
>      return __murmur2_or_cityhash<size_t>()(__p,
> (__e-__p)*sizeof(value_type));
>
> Modified: libcxx/trunk/include/experimental/filesystem
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> experimental/filesystem?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/experimental/filesystem (original)
> +++ libcxx/trunk/include/experimental/filesystem Thu Sep 15 17:27:07 2016
> @@ -249,7 +249,7 @@ struct _LIBCPP_TYPE_VIS space_info
>    uintmax_t available;
>  };
>
> -enum class _LIBCPP_TYPE_VIS file_type : signed char
> +enum class _LIBCPP_ENUM_VIS file_type : signed char
>  {
>      none       = 0,
>      not_found  = -1,
> @@ -263,7 +263,7 @@ enum class _LIBCPP_TYPE_VIS file_type :
>      unknown    = 8
>  };
>
> -enum class _LIBCPP_TYPE_VIS perms : unsigned
> +enum class _LIBCPP_ENUM_VIS perms : unsigned
>  {
>      none         = 0,
>
> @@ -323,7 +323,7 @@ _LIBCPP_INLINE_VISIBILITY
>  inline perms& operator^=(perms& _LHS, perms _RHS)
>  { return _LHS = _LHS ^ _RHS; }
>
> -enum class _LIBCPP_TYPE_VIS copy_options : unsigned short
> +enum class _LIBCPP_ENUM_VIS copy_options : unsigned short
>  {
>      none               = 0,
>      skip_existing      = 1,
> @@ -367,7 +367,7 @@ inline copy_options& operator^=(copy_opt
>  { return _LHS = _LHS ^ _RHS; }
>
>
> -enum class directory_options : unsigned char
> +enum class _LIBCPP_ENUM_VIS directory_options : unsigned char
>  {
>      none                     = 0,
>      follow_directory_symlink = 1,
>
> Modified: libcxx/trunk/include/istream
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> istream?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/istream (original)
> +++ libcxx/trunk/include/istream Thu Sep 15 17:27:07 2016
> @@ -1741,9 +1741,9 @@ operator>>(basic_istream<_CharT, _Traits
>      return __is;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<char>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_istream<wchar_t>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_iostream<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_istream<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_istream<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_iostream<char>)
>
>  _LIBCPP_END_NAMESPACE_STD
>
>
> Modified: libcxx/trunk/include/locale
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> locale?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/locale (original)
> +++ libcxx/trunk/include/locale Thu Sep 15 17:27:07 2016
> @@ -523,8 +523,8 @@ __num_get<_CharT>::__stage2_float_loop(_
>      return 0;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_get<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_get<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __num_get<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __num_get<wchar_t>)
>
>  template <class _CharT, class _InputIterator =
> istreambuf_iterator<_CharT> >
>  class _LIBCPP_TYPE_VIS_ONLY num_get
> @@ -1042,8 +1042,8 @@ num_get<_CharT, _InputIterator>::do_get(
>      return __b;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_get<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_get<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> num_get<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> num_get<wchar_t>)
>
>  struct _LIBCPP_TYPE_VIS __num_put_base
>  {
> @@ -1192,8 +1192,8 @@ __num_put<_CharT>::__widen_and_group_flo
>          __op = __ob + (__np - __nb);
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_put<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_TYPE_VIS __num_put<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __num_put<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __num_put<wchar_t>)
>
>  template <class _CharT, class _OutputIterator =
> ostreambuf_iterator<_CharT> >
>  class _LIBCPP_TYPE_VIS_ONLY num_put
> @@ -1621,8 +1621,8 @@ num_put<_CharT, _OutputIterator>::do_put
>      return __pad_and_output(__s, __o, __op, __oe, __iob, __fl);
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_put<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS num_put<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> num_put<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> num_put<wchar_t>)
>
>  template <class _CharT, class _InputIterator>
>  _LIBCPP_HIDDEN
> @@ -2291,8 +2291,8 @@ time_get<_CharT, _InputIterator>::do_get
>      return __b;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_get<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_get<wchar_t>)
>
>  class _LIBCPP_TYPE_VIS __time_get
>  {
> @@ -2374,8 +2374,8 @@ private:
>      virtual const string_type& __X() const      {return this->__X_;}
>  };
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get_byname<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_get_byname<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_get_byname<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_get_byname<wchar_t>)
>
>  class _LIBCPP_TYPE_VIS __time_put
>  {
> @@ -2487,8 +2487,8 @@ time_put<_CharT, _OutputIterator>::do_pu
>      return _VSTD::copy(__nb, __ne, __s);
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_put<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_put<wchar_t>)
>
>  template <class _CharT, class _OutputIterator =
> ostreambuf_iterator<_CharT> >
>  class _LIBCPP_TYPE_VIS_ONLY time_put_byname
> @@ -2508,8 +2508,8 @@ protected:
>      ~time_put_byname() {}
>  };
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put_byname<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS time_put_byname<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_put_byname<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> time_put_byname<wchar_t>)
>
>  // money_base
>
> @@ -2575,10 +2575,10 @@ template <class _CharT, bool _Internatio
>  const bool
>  moneypunct<_CharT, _International>::intl;
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<char, false>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<char, true>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<wchar_t,
> false>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct<wchar_t,
> true>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct<char, false>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct<char, true>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct<wchar_t, false>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct<wchar_t, true>)
>
>  // moneypunct_byname
>
> @@ -2632,10 +2632,10 @@ template<> void moneypunct_byname<char,
>  template<> void moneypunct_byname<wchar_t, false>::init(const char*);
>  template<> void moneypunct_byname<wchar_t, true>::init(const char*);
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<char,
> false>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS moneypunct_byname<char,
> true>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS
> moneypunct_byname<wchar_t, false>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS
> moneypunct_byname<wchar_t, true>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct_byname<char, false>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct_byname<char, true>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct_byname<wchar_t, false>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> moneypunct_byname<wchar_t, true>)
>
>  // money_get
>
> @@ -2691,8 +2691,8 @@ __money_get<_CharT>::__gather_info(bool
>      }
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_get<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_get<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __money_get<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __money_get<wchar_t>)
>
>  template <class _CharT, class _InputIterator =
> istreambuf_iterator<_CharT> >
>  class _LIBCPP_TYPE_VIS_ONLY money_get
> @@ -3074,8 +3074,8 @@ money_get<_CharT, _InputIterator>::do_ge
>      return __b;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_get<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_get<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> money_get<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> money_get<wchar_t>)
>
>  // money_put
>
> @@ -3249,8 +3249,8 @@ __money_put<_CharT>::__format(char_type*
>          __mi = __mb;
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_put<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS __money_put<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __money_put<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __money_put<wchar_t>)
>
>  template <class _CharT, class _OutputIterator =
> ostreambuf_iterator<_CharT> >
>  class _LIBCPP_TYPE_VIS_ONLY money_put
> @@ -3402,8 +3402,8 @@ money_put<_CharT, _OutputIterator>::do_p
>      return __pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_put<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS money_put<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> money_put<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> money_put<wchar_t>)
>
>  // messages
>
> @@ -3512,8 +3512,8 @@ messages<_CharT>::do_close(catalog __c)
>  #endif // _LIBCPP_HAS_CATOPEN
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> messages<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> messages<wchar_t>)
>
>  template <class _CharT>
>  class _LIBCPP_TYPE_VIS_ONLY messages_byname
> @@ -3536,8 +3536,8 @@ protected:
>      ~messages_byname() {}
>  };
>
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages_byname<char>)
> -_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS messages_byname<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> messages_byname<char>)
> +_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> messages_byname<wchar_t>)
>
>  template<class _Codecvt, class _Elem = wchar_t,
>           class _Wide_alloc = allocator<_Elem>,
>
> Modified: libcxx/trunk/include/ostream
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> ostream?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/ostream (original)
> +++ libcxx/trunk/include/ostream Thu Sep 15 17:27:07 2016
> @@ -1113,8 +1113,8 @@ operator<<(basic_ostream<_CharT, _Traits
>                           use_facet<ctype<_CharT>
> >(__os.getloc()).widen('1'));
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<char>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ostream<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_ostream<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_ostream<wchar_t>)
>
>  _LIBCPP_END_NAMESPACE_STD
>
>
> Modified: libcxx/trunk/include/streambuf
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> streambuf?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/streambuf (original)
> +++ libcxx/trunk/include/streambuf Thu Sep 15 17:27:07 2016
> @@ -574,11 +574,11 @@ basic_streambuf<_CharT, _Traits>::overfl
>      return traits_type::eof();
>  }
>
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<char>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_streambuf<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_streambuf<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_streambuf<wchar_t>)
>
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<char>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_ios<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_ios<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_ios<wchar_t>)
>
>  _LIBCPP_END_NAMESPACE_STD
>
>
> Modified: libcxx/trunk/include/string
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> string?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/string (original)
> +++ libcxx/trunk/include/string Thu Sep 15 17:27:07 2016
> @@ -574,7 +574,7 @@ __basic_string_common<__b>::__throw_out_
>  #pragma warning( push )
>  #pragma warning( disable: 4231 )
>  #endif // _LIBCPP_MSVC
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS
> __basic_string_common<true>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __basic_string_common<true>)
>  #ifdef _LIBCPP_MSVC
>  #pragma warning( pop )
>  #endif // _LIBCPP_MSVC
> @@ -1024,7 +1024,7 @@ public:
>      _LIBCPP_INLINE_VISIBILITY
>      basic_string& replace(size_type __pos1, size_type __n1, __self_view
> __sv) { return replace(__pos1, __n1, __sv.data(), __sv.size()); }
>      basic_string& replace(size_type __pos1, size_type __n1, const
> basic_string& __str, size_type __pos2, size_type __n2=npos);
> -    _LIBCPP_INLINE_VISIBILITY
> +    inline _LIBCPP_INLINE_VISIBILITY
>      basic_string& replace(size_type __pos1, size_type __n1, __self_view
> __sv, size_type __pos2, size_type __n2=npos);
>      basic_string& replace(size_type __pos, size_type __n1, const
> value_type* __s, size_type __n2);
>      basic_string& replace(size_type __pos, size_type __n1, const
> value_type* __s);
> @@ -3910,8 +3910,8 @@ inline namespace literals
>  }
>  #endif
>
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<char>)
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS basic_string<wchar_t>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_string<char>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> basic_string<wchar_t>)
>  _LIBCPP_EXTERN_TEMPLATE(string operator+<char, char_traits<char>,
> allocator<char> >(char const*, string const&))
>
>  _LIBCPP_END_NAMESPACE_STD
>
> Modified: libcxx/trunk/include/vector
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/
> vector?rev=281673&r1=281672&r2=281673&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/include/vector (original)
> +++ libcxx/trunk/include/vector Thu Sep 15 17:27:07 2016
> @@ -312,7 +312,7 @@ __vector_base_common<__b>::__throw_out_o
>  #pragma warning( push )
>  #pragma warning( disable: 4231 )
>  #endif // _LIBCPP_MSVC
> -_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS __vector_base_common<true>)
> +_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
> __vector_base_common<true>)
>  #ifdef _LIBCPP_MSVC
>  #pragma warning( pop )
>  #endif // _LIBCPP_MSVC
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161007/1161369c/attachment-0001.html>


More information about the cfe-commits mailing list