[Bug ipa/64181] 'noexcept' on a lambda sometimes appears to get optimised away at -O2 (or above).

miyuki at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 2 13:27:00 GMT 2015


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

Mikhail Maltsev <miyuki at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2015-06-02
                 CC|                            |miyuki at gcc dot gnu.org
          Component|c++                         |ipa
     Ever confirmed|0                           |1
      Known to fail|                            |5.1.0, 6.0

--- Comment #2 from Mikhail Maltsev <miyuki at gcc dot gnu.org> ---
Happens if calls get inlined in some "special" way (in this testcase, invoke()
is inlined into execute() and lambda is inlined into run(), i.e. we have 3
functions: throw_exception, run and main).

$ cat test.cc

template <typename F>
struct Helper
{
    F func;
    Helper(F f) : func(f) {}
    virtual void run() { func(); }
};

struct Tester
{
    template <typename F>
    void invoke(F f)
    {
        Helper<F> h(f);
        auto volatile ptr = &h;
        ptr->run();
    }

    virtual void throw_exception() { throw 2; }

    void execute() {
        invoke([this]() noexcept { throw_exception(); });
    }
};

int main()
{
  Tester t;
  try {
    t.execute();
  } catch (int) {  }
}


$ g++ -std=c++11 -O1 ./test.cc
$ ./a.out
terminate called after throwing an instance of 'int'
Aborted
$ g++ -std=c++11 -O3 ./test.cc
$ ./a.out
(no output)



More information about the Gcc-bugs mailing list