// RUN: %clang_cc1 -std=c++11 -verify %s // // Note: [class.inhctor] was removed by P0136R1. This tests the new behavior // for the wording that used to be there. template struct X {}; // A[n inheriting] constructor [...] has the same access as the corresponding // constructor [in the base class]. struct A { public: A(X<0>) {} protected: A(X<1>) {} // expected-note 2{{declared protected here}} private: A(X<2>) {} // expected-note 2{{declared private here}} friend class FA; }; struct B : A { using A::A; friend class FB; }; B b0{X<0>{}}; B b1{X<1>{}}; // expected-error {{calling a protected constructor}} B b2{X<2>{}}; // expected-error {{calling a private constructor}} struct C : B { C(X<0> x) : B(x) {} C(X<1> x) : B(x) {} }; struct FB { B b0{X<0>{}}; B b1{X<1>{}}; }; struct FA : A { using A::A; }; FA fa0{X<0>{}}; FA fa1{X<1>{}}; // expected-error {{calling a protected constructor}} FA fa2{X<2>{}}; // expected-error {{calling a private constructor}} // It is deleted if the corresponding constructor [...] is deleted. struct G { G(int) = delete; // expected-note {{'G' has been explicitly marked deleted here}} template G(T*) = delete; // expected-note {{'G' has been explicitly marked deleted here}} }; struct H : G { using G::G; }; H h1(5); // expected-error {{call to deleted constructor of 'H'}} H h2("foo"); // expected-error {{call to deleted constructor of 'H'}} // Core defect: It is also deleted if multiple base constructors generate the // same signature. namespace DRnnnn { struct A { constexpr A(int, float = 0) {} // expected-note {{candidate}} explicit A(int, int = 0) {} // expected-note {{candidate}} A(int, int, int = 0) = delete; // expected-note {{deleted}} }; struct B : A { using A::A; // expected-note 3{{inherited here}} }; constexpr B b0(0, 0.0f); // ok, constexpr B b1(0, 1); // expected-error {{call to constructor of 'DRnnnn::B' is ambiguous}} }