http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58163

            Bug ID: 58163
           Summary: [C++11] Pedantic assert on str[str.size()] is wrong in
                    C++11
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ppluzhnikov at google dot com

Google ref b/10322506

/// --- cut ---
#include <string>

int main()
{
  const std::string cs;
        std::string  s;

  if (cs[0] != '\0') return 1;
  if (s[0] != '\0') return 2;

  return 0;
}
/// --- cut ---

Using trunk gcc g++ (GCC) 4.9.0 20130814 (experimental)

g++ -g t.cc -D_GLIBCXX_DEBUG_PEDANTIC -D_GLIBCXX_DEBUG -std=c++11 && ./a.out
/gcc-svn-install/include/c++/4.9.0/bits/basic_string.h:848:
std::basic_string<_CharT, _Traits, _Alloc>::reference std::basic_string<_CharT,
_Traits, _Alloc>::operator[](std::basic_string<_CharT, _Traits,
_Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>;
_Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits,
_Alloc>::reference = char&; std::basic_string<_CharT, _Traits,
_Alloc>::size_type = long unsigned int]: Assertion '__pos < size()' failed.

In C++98:

21.3.4 basic_string element access [lib.string.access]

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

Returns: If pos < size(), returns data()[pos]. Otherwise, if pos == size(),
the const version returns charT().

Otherwise, the behavior is undefined.  <<== PEDASSERT catches this.


However, in C++11:

21.4.5 basic_string element access [string.access]

const_reference operator[](size_type pos) const;
reference operator[](size_type pos);

Requires: pos <= size().

Returns: *(begin() + pos) if pos < size(), otherwise a reference to an object
of type T with value charT(); the referenced value shall not be modied.


Note removal of undefined behavior.

Reply via email to