blob: d89fef81b2c97342943217f88c9a95a7139ef04b [file] [log] [blame]
// PR optimization/6713
// This testcase segfaulted on x86 because a dangling REG_EQUAL note
// resulted in incorrect substitutions later.
// { dg-do run }
// { dg-options "-O2" }
template<typename _CharT> class basic_iterator
{
public:
basic_iterator(_CharT* _p) : _M_current(_p) {}
basic_iterator& operator++() { ++_M_current; return *this; }
_CharT& operator*() const { return *_M_current; }
bool operator!=(basic_iterator &_rhs) { return _M_current != _rhs._M_current; }
private:
_CharT* _M_current;
};
template<typename _CharT> class basic_string
{
public:
typedef unsigned int size_type;
typedef basic_iterator<_CharT> iterator;
private:
struct _Rep
{
size_type _M_length;
size_type _M_capacity;
int _M_references;
bool _M_is_leaked() const { return _M_references < 0; }
bool _M_is_shared() const { return _M_references > 0; }
void _M_set_leaked() { _M_references = -1; }
void _M_set_sharable() { _M_references = 0; }
};
struct _Rep _M_rep;
struct _Alloc_hider
{
_CharT _raw[16];
_CharT* _M_p;
};
mutable _Alloc_hider _M_dataplus;
_CharT* _M_data() const { return _M_dataplus._M_p; }
void _M_leak() { if (!_M_rep._M_is_leaked()) _M_leak_hard(); }
static int count;
static void _M_leak_hard();
public:
explicit basic_string(const _CharT* __s);
iterator begin() { _M_leak(); return iterator(_M_data()); }
iterator end() { _M_leak(); return iterator(_M_data() + this->size()); }
size_type size() const { return _M_rep._M_length; }
};
template<typename _CharT> basic_string<_CharT>::
basic_string(const _CharT* __s)
{
int i;
for (i=0; i<15; i++) {
if (!__s[i])
break;
_M_dataplus._raw[i] = __s[i];
}
_M_dataplus._raw[i] = 0;
_M_dataplus._M_p = _M_dataplus._raw;
_M_rep._M_length = i;
_M_rep._M_capacity = i;
_M_rep._M_references = 1;
}
template<typename _CharT> int basic_string<_CharT>::count = 0;
template<typename _CharT> void basic_string<_CharT>::
_M_leak_hard()
{
count++;
}
typedef basic_string<char> string;
template int basic_string<char>::count;
int isspa(int ch)
{
return 0;
}
void foo(string& str)
{
string::iterator it = str.begin();
string::iterator stop = str.end();
for (; it != stop; ++it)
if (isspa(*it))
break;
}
int main()
{
string str("test");
foo(str);
}