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> >’}

Reply via email to