gcc/libstdc++-v3/include/bits
Jonathan Wakely d72888d340 PR libstdc++/86138 prevent implicit instantiation of COW empty rep
The explicit instantiation declarations for std::basic_string are
disabled for C++17 (and later) so that basic_string symbols get
implicitly instantiated in every translation unit that needs them.  On
targets that don't support STB_GNU_UNIQUE this leads to multiple copies
of the empty rep symbol for COW strings. In order to detect whether a
COW string needs to deallocate its storage it compares the address with
the empty rep.  When there are multiple copies of the empty rep object
the address is not unique, and so string destructors try to delete the
empty rep, which crashes.

In order to guarantee uniqueness of the _S_empty_rep_storage symbol this
patch adds an explicit instantiation declaration for just that symbol.
This means the other symbols are still implicitly instantiated in C++17
code, but for the empty rep the definition in the library gets used.

Separately, there is no need for C++17 code to implicitly instantiate
the I/O functions for strings, so this also restores the explicit
instantiation declarations for those functions.

	PR libstdc++/86138
	* include/bits/basic_string.tcc:
	[__cplusplus > 201402 && !_GLIBCXX_USE_CXX11_ABI]
	(basic_string<char>::_Rep::_S_empty_rep_storage)
	(basic_string<wchar_t>::_Rep::_S_empty_rep_storage): Add explicit
	instantiation declarations.
	[__cplusplus > 201402] (operator>>, operator<<, getline): Re-enable
	explicit instantiation declarations.
	* testsuite/21_strings/basic_string/cons/char/86138.cc: New.
	* testsuite/21_strings/basic_string/cons/wchar_t/86138.cc: New.

From-SVN: r261873
2018-06-22 00:29:01 +01:00
..
algorithmfwd.h Update copyright years. 2018-01-03 11:03:58 +01:00
alloc_traits.h Update copyright years. 2018-01-03 11:03:58 +01:00
allocated_ptr.h Update copyright years. 2018-01-03 11:03:58 +01:00
allocator.h LWG 3035. std::allocator's constructors should be constexpr 2018-06-18 16:47:07 +01:00
atomic_base.h Implement P0558R2 changes to std::atomic 2018-05-24 16:28:26 +01:00
atomic_futex.h Update copyright years. 2018-01-03 11:03:58 +01:00
basic_ios.h Update copyright years. 2018-01-03 11:03:58 +01:00
basic_ios.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
basic_string.h PR libstdc++/83328 add correct basic_string::insert for initializer_list 2018-06-21 23:01:25 +01:00
basic_string.tcc PR libstdc++/86138 prevent implicit instantiation of COW empty rep 2018-06-22 00:29:01 +01:00
boost_concept_check.h Update copyright years. 2018-01-03 11:03:58 +01:00
c++0x_warning.h Update copyright years. 2018-01-03 11:03:58 +01:00
c++config P0754R2 <version> header 2018-06-18 17:42:11 +01:00
char_traits.h Only define __cpp_lib_constexpr_char_traits for C++17 2018-06-15 16:47:56 +01:00
codecvt.h Update copyright years. 2018-01-03 11:03:58 +01:00
concept_check.h Update copyright years. 2018-01-03 11:03:58 +01:00
cpp_type_traits.h Update copyright years. 2018-01-03 11:03:58 +01:00
deque.tcc deque.tcc (deque<>::_M_assign_aux): Cast to void to ensure overloaded comma not used. 2018-05-02 19:51:33 +00:00
enable_special_members.h Update copyright years. 2018-01-03 11:03:58 +01:00
forward_list.h PR libstdc++/86127 avoid unnecessary allocator conversions 2018-06-13 16:14:48 +01:00
forward_list.tcc PR libstdc++/86127 avoid unnecessary allocator conversions 2018-06-13 16:14:48 +01:00
fs_dir.h Update copyright years. 2018-01-03 11:03:58 +01:00
fs_fwd.h Update copyright years. 2018-01-03 11:03:58 +01:00
fs_ops.h Avoid redundant calls to filesystem::status_known 2018-01-04 13:46:22 +00:00
fs_path.h LWG 2989 hide path iostream operators from normal lookup 2018-06-18 19:59:44 +01:00
fstream.tcc Add support for opening file streams from wide character strings 2018-05-21 18:18:35 +01:00
functexcept.h Update copyright years. 2018-01-03 11:03:58 +01:00
functional_hash.h Update copyright years. 2018-01-03 11:03:58 +01:00
gslice.h Update copyright years. 2018-01-03 11:03:58 +01:00
gslice_array.h PR libstdc++/83860 avoid dangling references in valarray closure types 2018-05-02 17:41:46 +01:00
hashtable.h re PR libstdc++/83709 (Inserting duplicates into an unordered associative containers causes the container to invalidate iterators) 2018-01-09 21:05:10 +00:00
hashtable_policy.h re PR libstdc++/83709 (Inserting duplicates into an unordered associative containers causes the container to invalidate iterators) 2018-01-09 21:05:10 +00:00
indirect_array.h Update copyright years. 2018-01-03 11:03:58 +01:00
invoke.h Update copyright years. 2018-01-03 11:03:58 +01:00
ios_base.h Define special members as defaulted 2018-06-08 17:43:14 +01:00
istream.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
list.tcc deque.tcc (deque<>::_M_assign_aux): Cast to void to ensure overloaded comma not used. 2018-05-02 19:51:33 +00:00
locale_classes.h Update copyright years. 2018-01-03 11:03:58 +01:00
locale_classes.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
locale_conv.h P0935R0 Eradicating unnecessarily explicit default constructors 2018-06-14 15:12:24 +01:00
locale_facets.h Update copyright years. 2018-01-03 11:03:58 +01:00
locale_facets.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
locale_facets_nonio.h Update copyright years. 2018-01-03 11:03:58 +01:00
locale_facets_nonio.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
localefwd.h Update copyright years. 2018-01-03 11:03:58 +01:00
mask_array.h PR libstdc++/83860 avoid dangling references in valarray closure types 2018-05-02 17:41:46 +01:00
memoryfwd.h Update copyright years. 2018-01-03 11:03:58 +01:00
move.h Update copyright years. 2018-01-03 11:03:58 +01:00
node_handle.h PR libstdc++/82966 fix swapping of node handles 2018-05-14 15:27:54 +01:00
ostream.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
ostream_insert.h Update copyright years. 2018-01-03 11:03:58 +01:00
parse_numbers.h PR libstdc++/84671 handle digit separators in duration literals 2018-03-02 20:38:50 +00:00
postypes.h Define std::fpos special members as defaulted 2018-06-04 17:07:55 +01:00
predefined_ops.h Update copyright years. 2018-01-03 11:03:58 +01:00
ptr_traits.h Update copyright years. 2018-01-03 11:03:58 +01:00
quoted_string.h PR libstdc++/86008 add std::quoted support for string_view 2018-06-06 07:05:07 +01:00
random.h PR libstdc++/86168 fix ambiguous default constructor 2018-06-15 17:11:12 +01:00
random.tcc PR libstdc++/85749 constrain seed sequences for random number engines 2018-05-15 16:36:46 +01:00
range_access.h Update copyright years. 2018-01-03 11:03:58 +01:00
refwrap.h LWG 2993 reference_wrapper<T> conversion from T&& 2018-06-15 15:19:47 +01:00
regex.h P0935R0 Eradicating unnecessarily explicit default constructors 2018-06-14 15:12:24 +01:00
regex.tcc re PR libstdc++/83601 (std::regex_replace C++14 conformance issue: escaping in SED mode) 2018-01-14 00:48:30 +00:00
regex_automaton.h PR libstdc++/85098 add missing definitions for static constants 2018-05-18 17:14:04 +01:00
regex_automaton.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
regex_compiler.h regex_compiler.h (_S_cache_size): Change from function to variable. 2018-05-10 15:12:23 -04:00
regex_compiler.tcc PR libstdc++/85098 add missing definitions for static constants 2018-05-18 17:14:04 +01:00
regex_constants.h Update copyright years. 2018-01-03 11:03:58 +01:00
regex_error.h Update copyright years. 2018-01-03 11:03:58 +01:00
regex_executor.h Update copyright years. 2018-01-03 11:03:58 +01:00
regex_executor.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
regex_scanner.h Update copyright years. 2018-01-03 11:03:58 +01:00
regex_scanner.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
shared_ptr.h Update copyright years. 2018-01-03 11:03:58 +01:00
shared_ptr_atomic.h Update copyright years. 2018-01-03 11:03:58 +01:00
shared_ptr_base.h Remove redundant std::move on const object 2018-06-06 20:39:27 +01:00
slice_array.h PR libstdc++/83860 avoid dangling references in valarray closure types 2018-05-02 17:41:46 +01:00
specfun.h Update copyright years. 2018-01-03 11:03:58 +01:00
sstream.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
std_abs.h PR libstdc++/85729 add linkage specifications to headers 2018-05-10 13:35:45 +01:00
std_function.h Make std::function tolerate semantically non-CopyConstructible objects 2018-05-09 14:28:11 +01:00
std_mutex.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_algo.h 2018-06-05 François Dumont <fdumont@gcc.gnu.org> 2018-06-05 05:47:44 +00:00
stl_algobase.h 2018-06-13 François Dumont <fdumont@gcc.gnu.org> 2018-06-13 20:27:26 +00:00
stl_bvector.h Define special members as defaulted 2018-06-08 17:43:14 +01:00
stl_construct.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_deque.h Some libstdc++ fixes for -Wdeprecated-copy. 2018-05-18 16:02:14 -04:00
stl_function.h PR libstdc++/85040 fix std::less<void> etc. ambiguities 2018-03-22 14:23:27 +00:00
stl_heap.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_iterator.h Some libstdc++ fixes for -Wdeprecated-copy. 2018-05-18 16:02:14 -04:00
stl_iterator_base_funcs.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_iterator_base_types.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_list.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_map.h stl_tree.h (_Rb_tree_impl(_Node_allocator&&)): New. 2018-05-27 17:06:40 +00:00
stl_multimap.h stl_tree.h (_Rb_tree_impl(_Node_allocator&&)): New. 2018-05-27 17:06:40 +00:00
stl_multiset.h stl_tree.h (_Rb_tree_impl(_Node_allocator&&)): New. 2018-05-27 17:06:40 +00:00
stl_numeric.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_pair.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_queue.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_raw_storage_iter.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_relops.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_set.h stl_tree.h (_Rb_tree_impl(_Node_allocator&&)): New. 2018-05-27 17:06:40 +00:00
stl_stack.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_tempbuf.h 2018-06-05 François Dumont <fdumont@gcc.gnu.org> 2018-06-05 05:47:44 +00:00
stl_tree.h stl_tree.h (_Rb_tree_impl(_Node_allocator&&)): New. 2018-05-27 17:06:40 +00:00
stl_uninitialized.h Update copyright years. 2018-01-03 11:03:58 +01:00
stl_vector.h Update copyright years. 2018-01-03 11:03:58 +01:00
stream_iterator.h Define special members as defaulted 2018-06-08 17:43:14 +01:00
streambuf.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
streambuf_iterator.h Define special members as defaulted 2018-06-08 17:43:14 +01:00
string_view.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
stringfwd.h Update copyright years. 2018-01-03 11:03:58 +01:00
uniform_int_dist.h P0935R0 Eradicating unnecessarily explicit default constructors 2018-06-14 14:32:53 +01:00
unique_ptr.h Update copyright years. 2018-01-03 11:03:58 +01:00
unordered_map.h re PR libstdc++/84998 (std::hash<std::bitset<N>> fails in Debug Mode) 2018-03-20 21:45:14 +00:00
unordered_set.h re PR libstdc++/84998 (std::hash<std::bitset<N>> fails in Debug Mode) 2018-03-20 21:45:14 +00:00
uses_allocator.h Update copyright years. 2018-01-03 11:03:58 +01:00
valarray_after.h LWG 3074 make scalar types non-deduced in valarray non-member functions 2018-06-14 20:36:54 +01:00
valarray_array.h Add __attribute__((malloc) to allocator and remove unused code 2018-05-14 16:35:12 +01:00
valarray_array.tcc Update copyright years. 2018-01-03 11:03:58 +01:00
valarray_before.h PR libstdc++/83860 avoid dangling references in valarray closure types 2018-05-02 17:41:46 +01:00
vector.tcc PR libstdc++/83982 fix exception-safety guarantee of std::vector::resize 2018-06-14 10:26:51 +01:00