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

            Bug ID: 69874
           Summary: Program crashes when an exception is thrown to second
                    base class reference
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: maysam.kind at gmail dot com
  Target Milestone: ---

I tried the following code using several GCCs and got problems when I run the
code which is compiled using O1 with gcc4.7.1 and onward.

#include <stdexcept>
#include <iostream>

struct Interface_1
{
    virtual void setA() = 0;
};

struct Interface_2
{
    virtual void setB() = 0;
};

struct Master: Interface_1, Interface_2
{
    void setA()
    {
        throw std::runtime_error("I was thrown");
    }
    void setB()
    {
        throw std::runtime_error("I was thrown");
    }
};

int main()
{
    Master m;
    Interface_2& i2 = m;
    try
    {
        i2.setB();
    }
    catch (const std::runtime_error& e)
    {
        std::cout << "Caught exception e=" << e.what() << std::endl;
    }
    catch (...)
    {
        std::cout << "Did not catch exception" << std::endl;
    }

    std::cout << "Done running" << std::endl;
}


In the code above I am a reference from interface Interface_2 to refer to an
object from Master class, and this will result into a crash

terminate called after throwing an instance of 'std::runtime_error'
  what():  I was thrown
Abort (core dumped)


But it works if I use a reference from Interface_1:

int main()
{
    Master m;
    Interface_1& i1 = m;
    try
    {
        i1.setA();
    }
    catch (const Exception& e)
    {
        std::cout << "Caught exception e=" << e.what() << std::endl;
    }
    catch (...)
    {
        std::cout << "Did not catchexception" << std::endl;
    }

    std::cout << "Done running" << std::endl;
}

I just get what is expected:

Caught exception e=I was thrown
Done running

It seems that the first interface that I inherit from can just be used to refer
to a object from Master class. I also made the inheritance from the first
interface as follows:

class Master: public virtual Interface_1, public Interface_2

Then references from Interface_2 just turned out to be fine. Instead, I got
problem with references from Interface_1.

Reply via email to