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