xref: /aosp_15_r20/external/clang/test/SemaCXX/converting-constructor.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
3*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
4*67e74705SXin Li 
5*67e74705SXin Li class Z { };
6*67e74705SXin Li 
7*67e74705SXin Li class Y {
8*67e74705SXin Li public:
9*67e74705SXin Li   Y(const Z&);
10*67e74705SXin Li };
11*67e74705SXin Li 
12*67e74705SXin Li class X {
13*67e74705SXin Li public:
14*67e74705SXin Li   X(int);
15*67e74705SXin Li   X(const Y&);
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li void f(X); // expected-note{{candidate function}}
19*67e74705SXin Li 
g(short s,Y y,Z z)20*67e74705SXin Li void g(short s, Y y, Z z) {
21*67e74705SXin Li   f(s);
22*67e74705SXin Li   f(1.0f);
23*67e74705SXin Li   f(y);
24*67e74705SXin Li   f(z); // expected-error{{no matching function}}
25*67e74705SXin Li }
26*67e74705SXin Li 
27*67e74705SXin Li 
28*67e74705SXin Li class FromShort {
29*67e74705SXin Li public:
30*67e74705SXin Li   FromShort(short s);
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li class FromShortExplicitly { // expected-note{{candidate constructor (the implicit copy constructor)}}
34*67e74705SXin Li #if __cplusplus >= 201103L // C++11 or later
35*67e74705SXin Li // expected-note@-2 {{candidate constructor (the implicit move constructor) not viable}}
36*67e74705SXin Li #endif
37*67e74705SXin Li 
38*67e74705SXin Li public:
39*67e74705SXin Li   explicit FromShortExplicitly(short s);
40*67e74705SXin Li };
41*67e74705SXin Li 
explicit_constructor(short s)42*67e74705SXin Li void explicit_constructor(short s) {
43*67e74705SXin Li   FromShort fs1(s);
44*67e74705SXin Li   FromShort fs2 = s;
45*67e74705SXin Li   FromShortExplicitly fse1(s);
46*67e74705SXin Li   FromShortExplicitly fse2 = s; // expected-error{{no viable conversion}}
47*67e74705SXin Li }
48*67e74705SXin Li 
49*67e74705SXin Li // PR5519
50*67e74705SXin Li struct X1 { X1(const char&); };
51*67e74705SXin Li void x1(X1);
y1()52*67e74705SXin Li void y1() {
53*67e74705SXin Li   x1(1);
54*67e74705SXin Li }
55