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

            Bug ID: 118576
           Summary: gcc does not realize implicitly deleted default
                    constructor in virtual inheritance with using-decl
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Keywords: accepts-invalid
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rush102333 at gmail dot com
  Target Milestone: ---

Consider the following code:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

struct A { 
    A(int); 
};
struct B : virtual A { using A::A; };

struct C1 : virtual B { using B::B; };

struct D1 : virtual C1
{
  using C1::C1;
};

D1 d1(0);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Clang rejects this by complaining that the default constructor of 'B' is
necessary here, which does not exist:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<source>:14:4: error: constructor inherited by 'D1' from base class 'A' is
implicitly deleted
   14 | D1 d1(0);
      |    ^
<source>:7:13: note: constructor inherited by 'D1' is implicitly deleted
because base class 'B' has a deleted corresponding constructor
    7 | struct C1 : virtual B { using B::B; };
      |             ^
<source>:5:12: note: default constructor of 'B' is implicitly deleted because
base class 'A' has no default constructor
    5 | struct B : virtual A { using A::A; };
      |            ^
1 error generated.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EDG and ICC error for similar reasons:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

"<source>", line 14: error: no default constructor exists for class "A"
  D1 d1(0);
          ^
          detected during implicit generation of "D1::A(int)" at line 14

1 error detected in the compilation of "<source>".
Compiler returned: 2

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

But gcc seems not: https://godbolt.org/z/5srhhqWeE

Reply via email to