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

            Bug ID: 116012
           Summary: gcc allows calling to implicitly-deleted default
                    constructor in virtual inheritance with inherited
                    constructor by using-declaration
           Product: gcc
           Version: 13.2.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: ---

The following code is accepted by gcc but rejected by clang, MSVC and EDG:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
struct base {
    base(int) {}
    virtual void foo() = 0;
    virtual ~base() {}
};

struct left : virtual base {
public:
    using base:: base;
};

struct derived : left{
    virtual void foo() override {}
    derived() : base(10) {}
};
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Because struct "left" inherits the constructors of its base class "base", it
has had a valid user-defined ctor. The defaulted ctor should then be deleted,
so the constructor's declaration of struct "derived" should be invalid.

Clang gives the following error message:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:15:5: error: call to implicitly-deleted default constructor of 'left'
   15 |     derived() : base(10) {}
      |     ^
1 error generated.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Please check https://godbolt.org/z/znbY1E4ro

Reply via email to