--- /dev/null
+// { dg-do compile }
+// { dg-additional-options "-O2 -fdump-tree-optimized" }
+#include<string>
+int sain() {
+ const std::string remove_me("remove_me");
+ return 0;
+}
+// { dg-final { scan-tree-dump-not "remove_me" "optimized" } }
--- /dev/null
+// { dg-do compile }
+// { dg-additional-options "-O2 -fdump-tree-optimized" }
+#include <string>
+
+
+__attribute__ ((pure))
+extern int foo (const std::string &);
+
+int
+bar ()
+{
+ return foo ("abc") + foo (std::string("abc"));
+}
+// We used to add terminating zero explicitely instead of using fact
+// that memcpy source is already 0 terminated.
_ZNSt8__format25__locale_encoding_to_utf8ERKSt6localeSt17basic_string_viewIcSt11char_traitsIcEEPv;
# __sso_string constructor and destructor
_ZNSt12__sso_string[CD][12]Ev;
+ # void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<bool>(char const*, unsigned long)
+ # and wide char version
+ _ZNSt7__cxx1112basic_stringI[cw]St11char_traitsI[cw]ESaI[cw]EE12_M_constructILb[01]EEEvPK[cw]m;
} GLIBCXX_3.4.33;
# Symbols in the support library (libsupc++) have their own tag.
void
_M_construct(size_type __req, _CharT __c);
+ // Construct using block of memory of known size.
+ // If _Terminated is true assume that source is already 0 terminated.
+ template<bool _Terminated>
+ _GLIBCXX20_CONSTEXPR
+ void
+ _M_construct(const _CharT *__c, size_type __n);
+
_GLIBCXX20_CONSTEXPR
allocator_type&
_M_get_allocator()
: _M_dataplus(_M_local_data(),
_Alloc_traits::_S_select_on_copy(__str._M_get_allocator()))
{
- _M_construct(__str._M_data(), __str._M_data() + __str.length(),
- std::forward_iterator_tag());
+ _M_construct<true>(__str._M_data(), __str.length());
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS
_M_set_length(__n);
}
+ // Length of string constructed is easier to propagate inter-procedurally
+ // than difference between iterators.
+ template<typename _CharT, typename _Traits, typename _Alloc>
+ template<bool _Terminated>
+ _GLIBCXX20_CONSTEXPR
+ void
+ basic_string<_CharT, _Traits, _Alloc>::
+ _M_construct(const _CharT *__str, size_type __n)
+ {
+ if (__n > size_type(_S_local_capacity))
+ {
+ _M_data(_M_create(__n, size_type(0)));
+ _M_capacity(__n);
+ }
+ else
+ _M_init_local_buf();
+
+ if (__n || _Terminated)
+ this->_S_copy(_M_data(), __str, __n + _Terminated);
+
+ _M_length(__n);
+ if (!_Terminated)
+ traits_type::assign(_M_data()[__n], _CharT());
+ }
+
template<typename _CharT, typename _Traits, typename _Alloc>
_GLIBCXX20_CONSTEXPR
void
void
S::_M_construct(const C*, const C*, forward_iterator_tag);
+ template
+ void
+ S::_M_construct<false>(const C*, size_t);
+
+ template
+ void
+ S::_M_construct<true>(const C*, size_t);
+
#else // !_GLIBCXX_USE_CXX11_ABI
template