https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92590
Bug ID: 92590 Summary: Cannot expose protected default constructor with "using" keyword in gcc 10 Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: proski at gnu dot org Target Milestone: --- This code fails to compile with the current gcc (commit d9be9f34fbb018c448dc5a02aaa95d6a6932135c) class Base { protected: Base(); }; class Derived : public Base { public: using Base::Base; }; Derived d; test.ii:11:9: error: ‘Base::Base()’ is protected within this context 11 | Derived d; | ^ test.ii:3:5: note: declared protected here 3 | Base(); | ^~~~ The error is emitted for any standard from c++11 to c++2a. No optimization or other flags are needed. The same code is compiled without any errors by gcc 9.2.1. Testing on godbolt.org shows that all other compilers accept it - all recent versions of clang, msvc, icc. I don't see any relevant changes mentioned in the GCC 10 release notes https://gcc.gnu.org/gcc-10/changes.html An inline implementation of the protected constructor fails too: class Base { protected: Base() {} }; class Derived : public Base { public: using Base::Base; }; Derived d; However, the code compiles with the default constructor: class Base { protected: Base() = default; }; class Derived : public Base { public: using Base::Base; }; Derived d;