1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
3 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
4 | |
5 | struct X0 { // expected-note {{candidate constructor (the implicit copy constructor) not viable}} |
6 | #if __cplusplus >= 201103L // C++11 or later |
7 | // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable}} |
8 | #endif |
9 | X0(int); // expected-note{{candidate}} |
10 | template<typename T> X0(T); // expected-note {{candidate}} |
11 | template<typename T, typename U> X0(T*, U*); // expected-note {{candidate}} |
12 | |
13 | // PR4761 |
14 | template<typename T> X0() : f0(T::foo) {} // expected-note {{candidate}} |
15 | int f0; |
16 | }; |
17 | |
18 | void accept_X0(X0); |
19 | |
20 | void test_X0(int i, float f) { |
21 | X0 x0a(i); |
22 | X0 x0b(f); |
23 | X0 x0c = i; |
24 | X0 x0d = f; |
25 | accept_X0(i); |
26 | accept_X0(&i); |
27 | accept_X0(f); |
28 | accept_X0(&f); |
29 | X0 x0e(&i, &f); |
30 | X0 x0f(&f, &i); |
31 | |
32 | X0 x0g(f, &i); // expected-error{{no matching constructor}} |
33 | } |
34 | |
35 | template<typename T> |
36 | struct X1 { |
37 | X1(const X1&); |
38 | template<typename U> X1(const X1<U>&); |
39 | }; |
40 | |
41 | template<typename T> |
42 | struct Outer { |
43 | typedef X1<T> A; |
44 | |
45 | A alloc; |
46 | |
47 | explicit Outer(const A& a) : alloc(a) { } |
48 | }; |
49 | |
50 | void test_X1(X1<int> xi) { |
51 | Outer<int> oi(xi); |
52 | Outer<float> of(xi); |
53 | } |
54 | |
55 | // PR4655 |
56 | template<class C> struct A {}; |
57 | template <> struct A<int>{A(const A<int>&);}; |
58 | struct B { A<int> x; B(B& a) : x(a.x) {} }; |
59 | |
60 | struct X2 { |
61 | X2(); // expected-note{{candidate constructor}} |
62 | X2(X2&); // expected-note {{candidate constructor}} |
63 | template<typename T> X2(T); // expected-note {{candidate template ignored: instantiation would take its own class type by value}} |
64 | }; |
65 | |
66 | X2 test(bool Cond, X2 x2) { |
67 | if (Cond) |
68 | return x2; // okay, uses copy constructor |
69 | |
70 | return X2(); // expected-error{{no matching constructor}} |
71 | } |
72 | |
73 | struct X3 { |
74 | template<typename T> X3(T); |
75 | }; |
76 | |
77 | template<> X3::X3(X3); // expected-error{{must pass its first argument by reference}} |
78 | |
79 | struct X4 { |
80 | X4(); |
81 | ~X4(); |
82 | X4(X4&); |
83 | template<typename T> X4(const T&, int = 17); |
84 | }; |
85 | |
86 | X4 test_X4(bool Cond, X4 x4) { |
87 | X4 a(x4, 17); // okay, constructor template |
88 | X4 b(x4); // okay, copy constructor |
89 | return X4(); |
90 | } |
91 | |
92 | // Instantiation of a non-dependent use of a constructor |
93 | struct DefaultCtorHasDefaultArg { |
94 | explicit DefaultCtorHasDefaultArg(int i = 17); |
95 | }; |
96 | |
97 | template<typename T> |
98 | void default_ctor_inst() { |
99 | DefaultCtorHasDefaultArg def; |
100 | } |
101 | |
102 | template void default_ctor_inst<int>(); |
103 | |
104 | template<typename T> |
105 | struct X5 { |
106 | X5(); |
107 | X5(const T &); |
108 | }; |
109 | |
110 | struct X6 { |
111 | template<typename T> X6(T); |
112 | }; |
113 | |
114 | void test_X5_X6() { |
115 | X5<X6> tf; |
116 | X5<X6> tf2(tf); |
117 | } |
118 | |
119 | namespace PR8182 { |
120 | struct foo { |
121 | foo(); |
122 | template<class T> foo(T&); |
123 | |
124 | private: |
125 | foo(const foo&); |
126 | }; |
127 | |
128 | void test_foo() { |
129 | foo f1; |
130 | foo f2(f1); |
131 | foo f3 = f1; |
132 | } |
133 | |
134 | } |
135 | |
136 | // Don't blow out the stack trying to call an illegal constructor |
137 | // instantiation. We intentionally allow implicit instantiations to |
138 | // exist, so make sure they're unusable. |
139 | // |
140 | // rdar://19199836 |
141 | namespace self_by_value { |
142 | template <class T, class U> struct A { |
143 | A() {} |
144 | A(const A<T,U> &o) {} |
145 | A(A<T,T> o) {} |
146 | }; |
147 | |
148 | void helper(A<int,float>); |
149 | |
150 | void test1(A<int,int> a) { |
151 | helper(a); |
152 | } |
153 | void test2() { |
154 | helper(A<int,int>()); |
155 | } |
156 | } |
157 | |
158 | namespace self_by_value_2 { |
159 | template <class T, class U> struct A { |
160 | A() {} // expected-note {{not viable: requires 0 arguments}} |
161 | A(A<T,U> &o) {} // expected-note {{not viable: expects an l-value}} |
162 | A(A<T,T> o) {} // expected-note {{ignored: instantiation takes its own class type by value}} |
163 | }; |
164 | |
165 | void helper_A(A<int,int>); // expected-note {{passing argument to parameter here}} |
166 | void test_A() { |
167 | helper_A(A<int,int>()); // expected-error {{no matching constructor}} |
168 | } |
169 | } |
170 | |
171 | namespace self_by_value_3 { |
172 | template <class T, class U> struct A { |
173 | A() {} |
174 | A(A<T,U> &o) {} |
175 | A(A<T,T> o) {} |
176 | }; |
177 | |
178 | void helper_A(A<int,int>); |
179 | void test_A(A<int,int> b) { |
180 | helper_A(b); |
181 | } |
182 | } |
183 | |