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

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

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

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Seems the C FE doesn't diagnose this kind of stuff at all and C++ FE just
warns:
volatile int v;

void
foo (void)
{
  __label__ x;
  goto *&&x;
  int b = (__extension__ ({ x: ++v; 0; }));
  (void) b;
}

void
bar (void)
{
  __label__ x;
  goto *&&x;
  #pragma omp parallel
  {
    x:;
    ++v;
  }
}

void
baz (void)
{
  __label__ x;
  #pragma omp parallel
  goto *&&x;
  x:;
}

All those are invalid cases, jumping into a statement expression is invalid,
jumping into OpenMP structured block or out of it as well.
But with computed goto it isn't necessarily proven that it is invalid, we can
just take address of the label somewhere (including inside of the statement
expression or OpenMP region), pass the address back and then goto to that with
whether it is a violation hidden e.g. through some non-visible function.

E.g.
volatile int v;

__attribute__((noipa)) void *
qux (void *x, void *y)
{
  return v ? x : y;
}

void
foo (void)
{
  void *p = (__extension__ ({ x: &&x; }));
  void *q = qux (p, &&y);
  y:;
  goto *q;
}

Reply via email to