📄 pr6713.c
字号:
// 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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -