This change makes it impossible to change the visibility of operator+ with -fvisibility=hidden, which is not desirable on Darwin.
For example: $ cat test.cpp #include <string> using namespace std; string foo1(string s) { return "abc" + s; } $ clang++ test.cpp -fvisibility=hidden -c; nm -m -a test.o | grep __ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ 0000000000000030 (__TEXT,__text) weak external __ZNSt3__1plIcNS_11char_traitsIcEENS_9allocatorIcEEEENS_12basic_stringIT_T0_T1_EEPKS6_RKS9_ The symbol used to be “weak private external”, but it is “weak external” now. > On Jul 13, 2017, at 2:35 PM, Shoaib Meenai via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Author: smeenai > Date: Thu Jul 13 14:35:52 2017 > New Revision: 307966 > > URL: http://llvm.org/viewvc/llvm-project?rev=307966&view=rev > Log: > [libc++] Mark string operator+ _LIBCPP_FUNC_VIS > > It has an extern template instantiation declaration in the headers and a > corresponding instantiation definition in the library, so we must mark > it with _LIBCPP_FUNC_VIS to make it available outside the library. > > This doesn't cause any ABI changes as-is since we don't build libc++ > with hidden visibility (so the function is exported anyway). It's needed > for building libc++ with hidden visibility, however. > > Clarify the Windows behavior for extern function templates while I'm > here, since this exercises that behavior. > > Modified: > libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst > libcxx/trunk/include/string > > Modified: libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst?rev=307966&r1=307965&r2=307966&view=diff > ============================================================================== > --- libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst (original) > +++ libcxx/trunk/docs/DesignDocs/VisibilityMacros.rst Thu Jul 13 14:35:52 2017 > @@ -98,7 +98,8 @@ Visibility Macros > 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 is the correct thing to do for them. > + 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 > > Modified: libcxx/trunk/include/string > URL: > http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/string?rev=307966&r1=307965&r2=307966&view=diff > ============================================================================== > --- libcxx/trunk/include/string (original) > +++ libcxx/trunk/include/string Thu Jul 13 14:35:52 2017 > @@ -4006,7 +4006,7 @@ basic_string<_CharT, _Traits, _Allocator > > _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_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, > char_traits<char>, allocator<char> >(char const*, string const&)) > > #if _LIBCPP_STD_VER > 11 > // Literal suffixes for basic_string [basic.string.literals] > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits