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

            Bug ID: 68903
           Summary: missing default initialization of member when combined
                    with virtual imheritance
           Product: gcc
           Version: 5.2.1
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: spam at trzeci dot pl
  Target Milestone: ---

B::b is not constructed at all in the following code:

struct Attribute
{
  int i;
  Attribute( int _i ) :i(_i) {}
};

struct O
{
  Attribute createAttribute(int i)
  { 
    return Attribute(i); 
  }
};

struct A : public O
{
  Attribute a = createAttribute(1);
};

struct B : public virtual A
{
  Attribute b = createAttribute(2);
};

#include <iostream>

int main()
{
  B *b = new B;
  std::cout << b->a.i << " " << b->b.i << std::endl;
  return 0;
}

compiled with -std=c++14
outputs: 1 0
should output: 1 2

probable cause:
combination of virtual inheritance in B with default initialization
of attribute from call to inherited method.

The bug exists in 4.9.2 and 5.2.1 (maybe other)
The bug is independent from any other compiler options.
Adding any of default constructors does not help.
Removing virtual inheritance helps.
Adding virtual inheritance between A and O helps.
Removing method call in default initialization of B::b helps.
Moving initializer of B::b to constructor also helps.

Reply via email to