https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64786

            Bug ID: 64786
           Summary: Eliminate exceptions thrown/caught inside a function
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olegendo at gcc dot gnu.org

If I'm not mistaken, in the following example:

int test (int a, int b, int* c)
{
  enum err_a_t { ERR_A };
  enum err_b_t { ERR_B };

  try
  {
    if ((a + b) == 123)
      throw ERR_A;

    if ((a - b) == 5)
      throw ERR_B;

    for (int i = 0; i < b; ++i)
      c[i] = 4;

    return 0;
  }
  catch (err_a_t)
  {
    c[0] = 0;
    return -1;
  }
  catch (err_b_t)
  {
    c[0] = 1;
    return -1;
  }
  catch (...)
  {
    __builtin_abort ();
  }
}

... the exceptions can be eliminated and converted into something like this
unless -fnon-call-exceptions is used (the mem accesses could throw).

int test (int a, int b, int* c)
{
  if ((a + b) == 123)
  {
    c[0] = 0;
    return -1;
  }

  if ((a - b) == 5)
  {
    c[0] = 0;
    return -1;
  }

  for (int i = 0; i < b; ++i)
    c[i] = 4;

  return 0;
}

.. because all possible exceptions are known and are also known to be caught in
the function itself and there's nothing to stack-unwind.

Reply via email to