[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaCXX / cxx11-inheriting-ctors.cpp
blobb855fb47c7d63cceeb652d98eb4a9c3208fcdf46
1 // RUN: %clang_cc1 -std=c++11 %s -verify
3 namespace PR15757 {
4 struct S {
5 };
7 template<typename X, typename Y> struct T {
8 template<typename A> T(X x, A &&a) {}
10 template<typename A> explicit T(A &&a)
11 noexcept(noexcept(T(X(), static_cast<A &&>(a))))
12 : T(X(), static_cast<A &&>(a)) {}
15 template<typename X, typename Y> struct U : T<X, Y> {
16 using T<X, Y>::T;
19 U<S, char> foo(char ch) { return U<S, char>(ch); }
21 int main() {
22 U<S, int> a(42);
23 U<S, char> b('4');
24 return 0;
28 namespace WrongIdent {
29 struct A {};
30 struct B : A {};
31 struct C : B {
32 using B::A;
36 namespace DefaultCtorConflict {
37 struct A { A(int = 0); };
38 struct B : A {
39 using A::A;
40 } b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor
41 struct C {
42 B b;
43 } c;
46 namespace InvalidConstruction {
47 struct A { A(int); };
48 struct B { B() = delete; };
49 struct C : A, B { using A::A; };
50 // Initialization here is performed as if by a defaulted default constructor,
51 // which would be ill-formed (in the immediate context) in this case because
52 // it would be defined as deleted.
53 template<typename T> void f(decltype(T(0))*);
54 template<typename T> int &f(...);
55 int &r = f<C>(0);
58 namespace ExplicitConv {
59 struct B {};
60 struct D : B { // expected-note 3{{candidate}}
61 using B::B;
63 struct X { explicit operator B(); } x;
64 struct Y { explicit operator D(); } y;
66 D dx(x); // expected-error {{no matching constructor}}
67 D dy(y);
70 namespace NestedListInit {
71 struct B { B(); } b; // expected-note 3{{candidate}}
72 struct D : B { // expected-note 14{{not viable}}
73 using B::B;
75 // This is a bit weird. We're allowed one pair of braces for overload
76 // resolution, and one more pair of braces due to [over.ics.list]/2.
77 B b1 = {b};
78 B b2 = {{b}};
79 B b3 = {{{b}}}; // expected-error {{no match}}
80 // Per a proposed defect resolution, we don't get to call
81 // D's version of B::B(const B&) here.
82 D d0 = b; // expected-error {{no viable conversion}}
83 D d1 = {b}; // expected-error {{no match}}
84 D d2 = {{b}}; // expected-error {{no match}}
85 D d3 = {{{b}}}; // expected-error {{no match}}
86 D d4 = {{{{b}}}}; // expected-error {{no match}}
89 namespace PR31606 {
90 // PR31606: as part of a proposed defect resolution, do not consider
91 // inherited constructors that would be copy constructors for any class
92 // between the declaring class and the constructed class (inclusive).
93 struct Base {};
95 struct A : Base {
96 using Base::Base;
97 bool operator==(A const &) const; // expected-note {{no known conversion from 'B' to 'const A' for 1st argument}}
100 struct B : Base {
101 using Base::Base;
104 bool a = A{} == A{};
105 // Note, we do *not* allow operator=='s argument to use the inherited A::A(Base&&) constructor to construct from B{}.
106 bool b = A{} == B{}; // expected-error {{invalid operands}}
109 namespace implicit_member_srcloc {
110 template<class T>
111 struct S3 {
114 template<class T>
115 struct S2 {
116 S2(S3<T> &&);
119 template<class T>
120 struct S1 : S2<T> {
121 using S2<T>::S2;
122 S1();
125 template<class T>
126 struct S0 {
127 S0();
128 S0(S0&&) = default;
129 S1<T> m1;
132 void foo1() {
133 S0<int> s0;
137 namespace PR47555 {
138 struct A { constexpr A(int) {} };
139 struct B : A { using A::A; };
140 template<typename> void f() {
141 constexpr B b = 0;
143 template void f<int>();
146 namespace PR48545 {
147 struct B {
148 void f();
149 private:
150 B(int, int = 0);
152 struct D : B { using B::B; };
153 void B::f() {
154 D{0};
155 D{0, 0};
156 D(0);
157 D(0, 0);
158 D u = {0};
159 D v = {0, 0};
160 D w{0};
161 D x{0, 0};
162 D y(0);
163 D z(0, 0);