https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88512
--- Comment #8 from Jonny Grant <jg at jguk dot org> --- Another example. 9 line file. Gives 48 lines of STL warnings... G++ only needs to say something clear: "error: std::string 'str' is const, and as such insert() method cannot be called" // g++ -Wall -c -o int int.cpp #include <string> int main() { const std::string str ="abc"; // NB. This 'str' should not be const const std::string str2 ="1 "; str.insert(4, str2); return str.size(); } G++8 output: $ g++-8 -Wall -c -o int int.cpp int.cpp: In function ‘int main()’: int.cpp:13:21: error: no matching function for call to ‘std::__cxx11::basic_string<char>::insert(int, const string&) const’ str.insert(4, str2); ^ In file included from /usr/include/c++/8/string:52, from int.cpp:3: /usr/include/c++/8/bits/basic_string.h:1524:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_iterator, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer = char*; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_iterator = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer = const char*; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(const_iterator __p, size_type __n, _CharT __c) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1524:7: note: candidate expects 3 arguments, 2 provided /usr/include/c++/8/bits/basic_string.h:1568:9: note: candidate: ‘template<class _InputIterator, class> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_iterator, _InputIterator, _InputIterator) [with _InputIterator = _InputIterator; <template-parameter-2-2> = <template-parameter-1-2>; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ insert(const_iterator __p, _InputIterator __beg, _InputIterator __end) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1568:9: note: template argument deduction/substitution failed: int.cpp:13:21: note: candidate expects 3 arguments, 2 provided str.insert(4, str2); ^ In file included from /usr/include/c++/8/string:52, from int.cpp:3: /usr/include/c++/8/bits/basic_string.h:1602:7: note: candidate: ‘void std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator, std::initializer_list<_Tp>) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer = char*]’ insert(iterator __p, initializer_list<_CharT> __l) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1602:7: note: no known conversion for argument 1 from ‘int’ to ‘std::__cxx11::basic_string<char>::iterator’ {aka ‘__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >’} /usr/include/c++/8/bits/basic_string.h:1622:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ <near match> insert(size_type __pos1, const basic_string& __str) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1622:7: note: passing ‘const string*’ {aka ‘const std::__cxx11::basic_string<char>*’} as ‘this’ argument discards qualifiers /usr/include/c++/8/bits/basic_string.h:1645:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(size_type __pos1, const basic_string& __str, ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1645:7: note: candidate expects 4 arguments, 2 provided /usr/include/c++/8/bits/basic_string.h:1668:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const _CharT*, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(size_type __pos, const _CharT* __s, size_type __n) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1668:7: note: candidate expects 3 arguments, 2 provided /usr/include/c++/8/bits/basic_string.h:1687:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(size_type __pos, const _CharT* __s) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1687:7: note: no known conversion for argument 2 from ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’} to ‘const char*’ /usr/include/c++/8/bits/basic_string.h:1711:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(size_type __pos, size_type __n, _CharT __c) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1711:7: note: candidate expects 3 arguments, 2 provided /usr/include/c++/8/bits/basic_string.h:1729:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__const_iterator, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer = char*; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__const_iterator = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer = const char*]’ insert(__const_iterator __p, _CharT __c) ^~~~~~ /usr/include/c++/8/bits/basic_string.h:1729:7: note: no known conversion for argument 1 from ‘int’ to ‘std::__cxx11::basic_string<char>::__const_iterator’ {aka ‘__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >’}