http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49039

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-05-18 
14:27:08 UTC ---
Strange, I can't reproduce the segfault on x86_64-linux on the trunk and in 4.6
it doesn't segfault for me, but fails the assertion (-O2 or -O1 -ftree-vrp,
with -O1 or -O0 it works).

The problem seems to have started with:
http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=164136
and got on the trunk fixed or made latent with:
http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=171386

Smaller testcase without any includes:

template <class T1, class T2>
struct pair
{
  T1 first;
  T2 second;
  pair (const T1 & a, const T2 & b):first (a), second (b) {}
};

template <class T1, class T2>
inline pair <T1, T2>
make_pair (T1 x, T2 y)
{
  return pair <T1, T2> (x, y);
}

typedef __SIZE_TYPE__ size_t;
struct S
{
  const char *Data;
  size_t Length;
  static size_t min (size_t a, size_t b) { return a < b ? a : b; }
  static size_t max (size_t a, size_t b) { return a > b ? a : b; }
  S () :Data (0), Length (0) { }
  S (const char *Str) : Data (Str), Length (__builtin_strlen (Str)) {}
  S (const char *data, size_t length) : Data (data), Length (length) {}
  bool empty () const { return Length == 0; }
  size_t size () const { return Length; }
  S slice (size_t Start, size_t End) const
  {
    Start = min (Start, Length);
    End = min (max (Start, End), Length);
    return S (Data + Start, End - Start);
  }
  pair <S, S> split (char Separator) const
  {
    size_t Idx = find (Separator);
    if (Idx == ~size_t (0))
      return make_pair (*this, S ());
    return make_pair (slice (0, Idx), slice (Idx + 1, ~size_t (0)));
  }
  size_t find (char C, size_t From = 0) const
  {
    for (size_t i = min (From, Length), e = Length; i != e; ++i)
      if (Data[i] == C)
    return i;
    return ~size_t (0);
  }
};

void
Test (const char *arg)
{
  S Desc (arg);
  while (!Desc.empty ())
    {
      pair <S, S> Split = Desc.split ('-');
      S Token = Split.first;
      Desc = Split.second;
      if (Token.empty ())
    continue;
      Split = Token.split (':');
      S Specifier = Split.first;
      if (Specifier.empty ())
    __builtin_abort ();
    }
}

int
main ()
{
  Test ("-");
  return 0;
}

Reply via email to