[Bug libstdc++/42261] infinite recursion from string(string::size_type(6), string::size_type('f'))
redi at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Thu Dec 3 11:34:00 GMT 2009
------- Comment #1 from redi at gcc dot gnu dot org 2009-12-03 11:34 -------
(In reply to comment #0)
> This leads to an infinite recursion between these two methods:
>
> // _GLIBCXX_RESOLVE_LIB_DEFECTS
> // 438. Ambiguity in the "do the right thing" clause
> template<class _Integer>
> static _CharT*
> _S_construct_aux(_Integer __beg, _Integer __end,
> const _Alloc& __a, __true_type)
> { return _S_construct(static_cast<size_type>(__beg), __end, __a); }
GCC 4.1 also cast __end to static_cast<value_type>(__end) which prevents the
recursion. I'm not sure why that was removed as part of resolving DR 438, it
looks necessary to me, but Paolo will know better
>
> template<class _InIterator>
> static _CharT*
> _S_construct(_InIterator __beg, _InIterator __end, const _Alloc& __a)
> {
> typedef typename std::__is_integer<_InIterator>::__type _Integral;
> return _S_construct_aux(__beg, __end, __a, _Integral());
> }
>
> The infinite recursion also happens with GCC 4.3.2. GCC 4.1.3 constructs a
> string containing "ffffff".
>
> I'm not familiar enough with the standard to know whether GCC 4.1.3 is correct,
> or whether 4.3.2 and 4.4.1 are (or whether neither behaviour is right), but
> generating an infinite loop for seemingly innocent looking code seems
> unhelpful.
>
> FWIW, the Comeau online compiler accepts the code, but I can't tell how it
> interprets it.
>
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42261
More information about the Gcc-bugs
mailing list