Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion libcxx/.clang-format
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ AttributeMacros: [
'_LIBCPP_DISABLE_EXTENSION_WARNING',
'_LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION',
'_LIBCPP_EXPORTED_FROM_ABI',
'_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS',
'_LIBCPP_FALLTHROUGH',
'_LIBCPP_HIDDEN',
'_LIBCPP_HIDE_FROM_ABI_AFTER_V1',
Expand Down
30 changes: 0 additions & 30 deletions libcxx/docs/DesignDocs/VisibilityMacros.rst
Original file line number Diff line number Diff line change
Expand Up @@ -75,36 +75,6 @@ Visibility Macros
**Windows Behavior**: DLLs do not support dllimport/export on class templates.
The macro has an empty definition on this platform.

**_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS**
Mark the member functions, typeinfo, and vtable of the type named in
an 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_TEMPLATE_VIS` attribute
specified on the primary template and to export the member functions produced
by the explicit instantiation in the dylib.

**Windows Behavior**: `extern template` and `dllexport` are fundamentally
incompatible *on a class template* on Windows; the former suppresses
instantiation, while the latter forces it. Specifying both on the same
declaration makes the class template be instantiated, which is not desirable
inside headers. This macro therefore expands to `dllimport` outside of libc++
but nothing inside of it (rather than expanding to `dllexport`); instead, the
explicit instantiations themselves are marked as exported. Note that this
applies *only* to extern *class* templates. Extern *function* templates obey
regular import/export semantics, and applying `dllexport` directly to the
extern template declaration (i.e. using `_LIBCPP_FUNC_VIS`) is the correct
thing to do for them.

**_LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS**
Mark the member functions, typeinfo, and vtable of an explicit instantiation
of a class template as being exported by the libc++ library. This attribute
must be specified on all class template explicit instantiations.

It is only necessary to mark the explicit instantiation itself (as opposed to
the extern template declaration) as exported on Windows, as discussed above.
On all other platforms, this macro has an empty definition.

**_LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS**
Mark a symbol as hidden so it will not be exported from shared libraries. This
is intended specifically for method templates of either classes marked with
Expand Down
25 changes: 12 additions & 13 deletions libcxx/include/__config
Original file line number Diff line number Diff line change
Expand Up @@ -363,23 +363,12 @@ typedef __char32_t char32_t;
# endif

# if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) || (defined(__MINGW32__) && !defined(_LIBCPP_BUILDING_LIBRARY))
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
# define _LIBCPP_OVERRIDABLE_FUNC_VIS
# define _LIBCPP_EXPORTED_FROM_ABI
# elif defined(_LIBCPP_BUILDING_LIBRARY)
# if defined(__MINGW32__)
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __declspec(dllexport)
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
# else
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS __declspec(dllexport)
# endif
# define _LIBCPP_OVERRIDABLE_FUNC_VIS __declspec(dllexport)
# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport)
# else
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __declspec(dllimport)
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
# define _LIBCPP_OVERRIDABLE_FUNC_VIS
# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport)
# endif
Expand All @@ -401,8 +390,6 @@ typedef __char32_t char32_t;
# define _LIBCPP_HIDDEN _LIBCPP_VISIBILITY("hidden")
# define _LIBCPP_TEMPLATE_DATA_VIS _LIBCPP_VISIBILITY("default")
# define _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_VISIBILITY("default")
# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_VISIBILITY("default")
# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS

// TODO: Make this a proper customization point or remove the option to override it.
# ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS
Expand Down Expand Up @@ -553,6 +540,17 @@ typedef __char32_t char32_t;
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORED_CXX23_EXTENSION _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++2b-extensions")
# endif

# if __has_warning("-Wdllexport-explicit-instantiation")
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORE_DLLEXPORT \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wdllexport-explicit-instantiation")
# elif defined(_LIBCPP_OBJECT_FORMAT_COFF)
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORE_DLLEXPORT \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wignored-attributes") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wdllexport-explicit-instantiation-decl")
# else
# define _LIBCPP_CLANG_DIAGNOSTIC_IGNORE_DLLEXPORT
# endif

// Clang modules take a significant compile time hit when pushing and popping diagnostics.
// Since all the headers are marked as system headers in the modulemap, we can simply disable this
// pushing and popping when building with clang modules.
Expand All @@ -564,6 +562,7 @@ typedef __char32_t char32_t;
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++17-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wc++20-extensions") \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED_CXX23_EXTENSION \
_LIBCPP_CLANG_DIAGNOSTIC_IGNORE_DLLEXPORT \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++14-extensions") \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++17-extensions") \
_LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++20-extensions") \
Expand Down
16 changes: 8 additions & 8 deletions libcxx/include/__locale
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,9 @@ long collate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) cons
return static_cast<long>(__h);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI collate<char>;
#if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS collate<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI collate<wchar_t>;
#endif

// template <class CharT> class collate_byname;
Expand Down Expand Up @@ -1251,17 +1251,17 @@ template <class _InternT, class _ExternT, class _StateT>
codecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname() {}
_LIBCPP_SUPPRESS_DEPRECATED_POP

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char, char, mbstate_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI codecvt_byname<char, char, mbstate_t>;
#if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI codecvt_byname<wchar_t, char, mbstate_t>;
#endif
extern template class _LIBCPP_DEPRECATED_IN_CXX20
_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>; // deprecated in C++20
_LIBCPP_EXPORTED_FROM_ABI codecvt_byname<char16_t, char, mbstate_t>; // deprecated in C++20
extern template class _LIBCPP_DEPRECATED_IN_CXX20
_LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>; // deprecated in C++20
_LIBCPP_EXPORTED_FROM_ABI codecvt_byname<char32_t, char, mbstate_t>; // deprecated in C++20
#if _LIBCPP_HAS_CHAR8_T
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char16_t, char8_t, mbstate_t>; // C++20
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS codecvt_byname<char32_t, char8_t, mbstate_t>; // C++20
extern template class _LIBCPP_EXPORTED_FROM_ABI codecvt_byname<char16_t, char8_t, mbstate_t>; // C++20
extern template class _LIBCPP_EXPORTED_FROM_ABI codecvt_byname<char32_t, char8_t, mbstate_t>; // C++20
#endif

template <size_t _Np>
Expand Down
4 changes: 2 additions & 2 deletions libcxx/include/__ostream/basic_ostream.h
Original file line number Diff line number Diff line change
Expand Up @@ -665,9 +665,9 @@ basic_ostream<char, _Traits>& operator<<(basic_ostream<char, _Traits>&, const ch

# endif // _LIBCPP_STD_VER >= 20

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ostream<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ostream<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ostream<wchar_t>;
# endif

_LIBCPP_END_NAMESPACE_STD
Expand Down
6 changes: 3 additions & 3 deletions libcxx/include/fstream
Original file line number Diff line number Diff line change
Expand Up @@ -1563,9 +1563,9 @@ inline void basic_fstream<_CharT, _Traits>::close() {
}

# if _LIBCPP_AVAILABILITY_HAS_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ifstream<char>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ofstream<char>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_filebuf<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ifstream<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ofstream<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_filebuf<char>;
# endif

_LIBCPP_END_NAMESPACE_STD
Expand Down
4 changes: 2 additions & 2 deletions libcxx/include/ios
Original file line number Diff line number Diff line change
Expand Up @@ -745,10 +745,10 @@ inline _LIBCPP_HIDE_FROM_ABI void basic_ios<_CharT, _Traits>::set_rdbuf(basic_st
ios_base::set_rdbuf(__sb);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ios<char>;

# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_ios<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_ios<wchar_t>;
# endif

_LIBCPP_HIDE_FROM_ABI inline ios_base& boolalpha(ios_base& __str) {
Expand Down
6 changes: 3 additions & 3 deletions libcxx/include/istream
Original file line number Diff line number Diff line change
Expand Up @@ -1365,11 +1365,11 @@ operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Size>& __x) {
return __is;
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_istream<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_istream<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_istream<wchar_t>;
# endif
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS basic_iostream<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI basic_iostream<char>;

_LIBCPP_END_NAMESPACE_STD

Expand Down
72 changes: 36 additions & 36 deletions libcxx/include/locale
Original file line number Diff line number Diff line change
Expand Up @@ -561,9 +561,9 @@ int __num_get<_CharT>::__stage2_float_loop(
return 0;
}

extern template struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<char>;
extern template struct _LIBCPP_EXPORTED_FROM_ABI __num_get<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_get<wchar_t>;
extern template struct _LIBCPP_EXPORTED_FROM_ABI __num_get<wchar_t>;
# endif

template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
Expand Down Expand Up @@ -1042,9 +1042,9 @@ _InputIterator num_get<_CharT, _InputIterator>::do_get(
return __b;
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI num_get<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_get<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI num_get<wchar_t>;
# endif

struct _LIBCPP_EXPORTED_FROM_ABI __num_put_base {
Expand Down Expand Up @@ -1160,9 +1160,9 @@ void __num_put<_CharT>::__widen_and_group_float(
__op = __ob + (__np - __nb);
}

extern template struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<char>;
extern template struct _LIBCPP_EXPORTED_FROM_ABI __num_put<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template struct _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __num_put<wchar_t>;
extern template struct _LIBCPP_EXPORTED_FROM_ABI __num_put<wchar_t>;
# endif

template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
Expand Down Expand Up @@ -1387,9 +1387,9 @@ num_put<_CharT, _OutputIterator>::do_put(iter_type __s, ios_base& __iob, char_ty
return std::__pad_and_output(__s, __o, __op, __oe, __iob, __fl);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI num_put<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS num_put<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI num_put<wchar_t>;
# endif

template <class _CharT, class _InputIterator>
Expand Down Expand Up @@ -1923,9 +1923,9 @@ _InputIterator time_get<_CharT, _InputIterator>::do_get(
return __b;
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_get<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_get<wchar_t>;
# endif

class _LIBCPP_EXPORTED_FROM_ABI __time_get {
Expand Down Expand Up @@ -2019,9 +2019,9 @@ private:
_LIBCPP_HIDE_FROM_ABI_VIRTUAL const string_type& __X() const override { return this->__X_; }
};

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_get_byname<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_get_byname<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_get_byname<wchar_t>;
# endif

class _LIBCPP_EXPORTED_FROM_ABI __time_put {
Expand Down Expand Up @@ -2108,9 +2108,9 @@ _OutputIterator time_put<_CharT, _OutputIterator>::do_put(
return std::copy(__nb, __ne, __s);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_put<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_put<wchar_t>;
# endif

template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
Expand All @@ -2126,9 +2126,9 @@ protected:
_LIBCPP_HIDE_FROM_ABI_VIRTUAL ~time_put_byname() override {}
};

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_put_byname<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS time_put_byname<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI time_put_byname<wchar_t>;
# endif

// money_base
Expand Down Expand Up @@ -2192,11 +2192,11 @@ locale::id moneypunct<_CharT, _International>::id;
template <class _CharT, bool _International>
const bool moneypunct<_CharT, _International>::intl;

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, false>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<char, true>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct<char, false>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct<char, true>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, false>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct<wchar_t, true>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct<wchar_t, false>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct<wchar_t, true>;
# endif

// moneypunct_byname
Expand Down Expand Up @@ -2249,16 +2249,16 @@ template <>
_LIBCPP_EXPORTED_FROM_ABI void moneypunct_byname<char, false>::init(const char*);
template <>
_LIBCPP_EXPORTED_FROM_ABI void moneypunct_byname<char, true>::init(const char*);
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, false>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<char, true>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct_byname<char, false>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct_byname<char, true>;

# if _LIBCPP_HAS_WIDE_CHARACTERS
template <>
_LIBCPP_EXPORTED_FROM_ABI void moneypunct_byname<wchar_t, false>::init(const char*);
template <>
_LIBCPP_EXPORTED_FROM_ABI void moneypunct_byname<wchar_t, true>::init(const char*);
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, false>;
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS moneypunct_byname<wchar_t, true>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct_byname<wchar_t, false>;
extern template class _LIBCPP_EXPORTED_FROM_ABI moneypunct_byname<wchar_t, true>;
# endif

// money_get
Expand Down Expand Up @@ -2319,9 +2319,9 @@ void __money_get<_CharT>::__gather_info(
}
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI __money_get<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_get<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI __money_get<wchar_t>;
# endif

template <class _CharT, class _InputIterator = istreambuf_iterator<_CharT> >
Expand Down Expand Up @@ -2633,9 +2633,9 @@ _InputIterator money_get<_CharT, _InputIterator>::do_get(
return __b;
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI money_get<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_get<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI money_get<wchar_t>;
# endif

// money_put
Expand Down Expand Up @@ -2811,9 +2811,9 @@ void __money_put<_CharT>::__format(
__mi = __mb;
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI __money_put<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __money_put<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI __money_put<wchar_t>;
# endif

template <class _CharT, class _OutputIterator = ostreambuf_iterator<_CharT> >
Expand Down Expand Up @@ -2957,9 +2957,9 @@ _OutputIterator money_put<_CharT, _OutputIterator>::do_put(
return std::__pad_and_output(__s, __mb, __mi, __me, __iob, __fl);
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI money_put<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS money_put<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI money_put<wchar_t>;
# endif

// messages
Expand Down Expand Up @@ -3042,9 +3042,9 @@ void messages<_CharT>::do_close(catalog __c) const {
# endif // _LIBCPP_HAS_CATOPEN
}

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI messages<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI messages<wchar_t>;
# endif

template <class _CharT>
Expand All @@ -3061,9 +3061,9 @@ protected:
_LIBCPP_HIDE_FROM_ABI_VIRTUAL ~messages_byname() override {}
};

extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<char>;
extern template class _LIBCPP_EXPORTED_FROM_ABI messages_byname<char>;
# if _LIBCPP_HAS_WIDE_CHARACTERS
extern template class _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS messages_byname<wchar_t>;
extern template class _LIBCPP_EXPORTED_FROM_ABI messages_byname<wchar_t>;
# endif

# if _LIBCPP_STD_VER < 26 || defined(_LIBCPP_ENABLE_CXX26_REMOVED_WSTRING_CONVERT)
Expand Down
Loading
Loading