1// PR tree-optimization/49039 2// { dg-do run } 3 4template <class T1, class T2> 5struct pair 6{ 7 T1 first; 8 T2 second; 9 pair (const T1 & a, const T2 & b):first (a), second (b) {} 10}; 11 12template <class T1, class T2> 13inline pair <T1, T2> 14make_pair (T1 x, T2 y) 15{ 16 return pair <T1, T2> (x, y); 17} 18 19typedef __SIZE_TYPE__ size_t; 20struct S 21{ 22 const char *Data; 23 size_t Length; 24 static size_t min (size_t a, size_t b) { return a < b ? a : b; } 25 static size_t max (size_t a, size_t b) { return a > b ? a : b; } 26 S () :Data (0), Length (0) { } 27 S (const char *Str) : Data (Str), Length (__builtin_strlen (Str)) {} 28 S (const char *data, size_t length) : Data (data), Length (length) {} 29 bool empty () const { return Length == 0; } 30 size_t size () const { return Length; } 31 S slice (size_t Start, size_t End) const 32 { 33 Start = min (Start, Length); 34 End = min (max (Start, End), Length); 35 return S (Data + Start, End - Start); 36 } 37 pair <S, S> split (char Separator) const 38 { 39 size_t Idx = find (Separator); 40 if (Idx == ~size_t (0)) 41 return make_pair (*this, S ()); 42 return make_pair (slice (0, Idx), slice (Idx + 1, ~size_t (0))); 43 } 44 size_t find (char C, size_t From = 0) const 45 { 46 for (size_t i = min (From, Length), e = Length; i != e; ++i) 47 if (Data[i] == C) 48 return i; 49 return ~size_t (0); 50 } 51}; 52 53void 54Test (const char *arg) 55{ 56 S Desc (arg); 57 while (!Desc.empty ()) 58 { 59 pair <S, S> Split = Desc.split ('-'); 60 S Token = Split.first; 61 Desc = Split.second; 62 if (Token.empty ()) 63 continue; 64 Split = Token.split (':'); 65 S Specifier = Split.first; 66 if (Specifier.empty ()) 67 __builtin_abort (); 68 } 69} 70 71int 72main () 73{ 74 Test ("-"); 75 return 0; 76} 77