On Mon, Apr 15, 2019 at 7:09 PM Andrew Pinski <pins...@gmail.com> wrote:
>
> On Sun, Apr 14, 2019 at 11:50 PM Richard Biener
> <richard.guent...@gmail.com> wrote:
> >
> > On Sat, Apr 13, 2019 at 12:34 AM Jeff Law <l...@redhat.com> wrote:
> > >
> > > On 4/12/19 3:24 PM, Jason Merrill wrote:
> > > > If a noexcept function calls a function that might throw, doing the tail
> > > > call optimization means that an exception thrown in the called function
> > > > will propagate out, breaking the noexcept specification.  So we need to
> > > > prevent the optimization in that case.
> > > >
> > > > Tested x86_64-pc-linux-gnu.  OK for trunk or hold for GCC 10?  This 
> > > > isn't a
> > > > regression, but it is a straightforward fix for a wrong-code bug.
> > > >
> > > >       * tree-tailcall.c (find_tail_calls): Don't turn a call from a
> > > >       nothrow function to a might-throw function into a tail call.
> > > I'd go on the trunk.  It's a wrong-code issue, what we're doing is just
> > > plain wrong.  One could even make a case for backporting to the branches.
> >
> > Hmm, how's this different from adding another indirection?  That is,
> > I don't understand why the tailcall is the issue here, shouldn't unwind
> > still stop at the noexcept caller?  Thus, isn't this wrong CFI instead?
>
> noexcept caller is no longer on the stack so the unwinder does not see it.
> It is not the tail call from a normal function to a noexcept that is
> an issue but rather inside a noexcept caller to a normal function.

Hmm, OK, so essentially a tail-call cannot be represented in the CFI
program.

> >
> > Of course I know to little about this.
> >
> > Btw, doesn't your check also prevent tail/sibling calls when
> > the caller wraps it into a try { } catch (...) {}?  Or does unwind
> > not work in that case either?
> >
> > Btw, I'd like to see a runtime testcase that fails.
>
> There is one in the bug report.  Though it would not work for the
> testsuite.  It should not be hard to change it to be one that works
> for the testsuite.

With dg-additional-sources and registering a custom std::terminate
it should work I guess (or by catching SIGABRT).

The patch and the bug also suggests that an internally
throwing function cannot be tail-called either (can't find a testcase
we'd mark as tail-call here)

Richard.

> Thanks,
> Andrew Pinski
>
> >
> > Richard.
> >
> > > jeff
> > >
> > > ps.  I'm a bit surprised it hasn't been reported until now.

Reply via email to