xref: /aosp_15_r20/external/clang/test/SemaCXX/copy-assignment.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li struct A {
3*67e74705SXin Li };
4*67e74705SXin Li 
5*67e74705SXin Li struct ConvertibleToA {
6*67e74705SXin Li   operator A();
7*67e74705SXin Li };
8*67e74705SXin Li 
9*67e74705SXin Li struct ConvertibleToConstA {
10*67e74705SXin Li   operator const A();
11*67e74705SXin Li };
12*67e74705SXin Li 
13*67e74705SXin Li struct B {
14*67e74705SXin Li   B& operator=(B&);  // expected-note 4 {{candidate function}}
15*67e74705SXin Li };
16*67e74705SXin Li 
17*67e74705SXin Li struct ConvertibleToB {
18*67e74705SXin Li   operator B();
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li struct ConvertibleToBref {
22*67e74705SXin Li   operator B&();
23*67e74705SXin Li };
24*67e74705SXin Li 
25*67e74705SXin Li struct ConvertibleToConstB {
26*67e74705SXin Li   operator const B();
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li struct ConvertibleToConstBref {
30*67e74705SXin Li   operator const B&();
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct C {
34*67e74705SXin Li   int operator=(int); // expected-note{{candidate function}}
35*67e74705SXin Li   long operator=(long); // expected-note{{candidate function}}
36*67e74705SXin Li   int operator+=(int); // expected-note{{candidate function}}
37*67e74705SXin Li   int operator+=(long); // expected-note{{candidate function}}
38*67e74705SXin Li };
39*67e74705SXin Li 
40*67e74705SXin Li struct D {
41*67e74705SXin Li   D& operator+=(const D &);
42*67e74705SXin Li };
43*67e74705SXin Li 
44*67e74705SXin Li struct ConvertibleToInt {
45*67e74705SXin Li   operator int();
46*67e74705SXin Li };
47*67e74705SXin Li 
test()48*67e74705SXin Li void test() {
49*67e74705SXin Li   A a, na;
50*67e74705SXin Li   const A constA = A();
51*67e74705SXin Li   ConvertibleToA convertibleToA;
52*67e74705SXin Li   ConvertibleToConstA convertibleToConstA;
53*67e74705SXin Li 
54*67e74705SXin Li   B b, nb;
55*67e74705SXin Li   const B constB = B();
56*67e74705SXin Li   ConvertibleToB convertibleToB;
57*67e74705SXin Li   ConvertibleToBref convertibleToBref;
58*67e74705SXin Li   ConvertibleToConstB convertibleToConstB;
59*67e74705SXin Li   ConvertibleToConstBref convertibleToConstBref;
60*67e74705SXin Li 
61*67e74705SXin Li   C c, nc;
62*67e74705SXin Li   const C constC = C();
63*67e74705SXin Li 
64*67e74705SXin Li   D d, nd;
65*67e74705SXin Li   const D constD = D();
66*67e74705SXin Li 
67*67e74705SXin Li   ConvertibleToInt convertibleToInt;
68*67e74705SXin Li 
69*67e74705SXin Li   na = a;
70*67e74705SXin Li   na = constA;
71*67e74705SXin Li   na = convertibleToA;
72*67e74705SXin Li   na = convertibleToConstA;
73*67e74705SXin Li   na += a; // expected-error{{no viable overloaded '+='}}
74*67e74705SXin Li 
75*67e74705SXin Li   nb = b;
76*67e74705SXin Li   nb = constB;  // expected-error{{no viable overloaded '='}}
77*67e74705SXin Li   nb = convertibleToB; // expected-error{{no viable overloaded '='}}
78*67e74705SXin Li   nb = convertibleToBref;
79*67e74705SXin Li   nb = convertibleToConstB; // expected-error{{no viable overloaded '='}}
80*67e74705SXin Li   nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}}
81*67e74705SXin Li 
82*67e74705SXin Li   nc = c;
83*67e74705SXin Li   nc = constC;
84*67e74705SXin Li   nc = 1;
85*67e74705SXin Li   nc = 1L;
86*67e74705SXin Li   nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}}
87*67e74705SXin Li   nc += 1;
88*67e74705SXin Li   nc += 1L;
89*67e74705SXin Li   nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}}
90*67e74705SXin Li 
91*67e74705SXin Li   nd = d;
92*67e74705SXin Li   nd += d;
93*67e74705SXin Li   nd += constD;
94*67e74705SXin Li 
95*67e74705SXin Li   int i;
96*67e74705SXin Li   i = convertibleToInt;
97*67e74705SXin Li   i = a; // expected-error{{assigning to 'int' from incompatible type 'A'}}
98*67e74705SXin Li }
99*67e74705SXin Li 
100*67e74705SXin Li // <rdar://problem/8315440>: Don't crash
101*67e74705SXin Li namespace test1 {
102*67e74705SXin Li   template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}}
A(UndeclaredType n)103*67e74705SXin Li     A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}}
104*67e74705SXin Li   };
105*67e74705SXin Li   template<typename T> class B : public A<T>     {
foo()106*67e74705SXin Li     virtual void foo() {}
107*67e74705SXin Li   };
108*67e74705SXin Li   extern template class A<char>;
109*67e74705SXin Li   extern template class B<char>;
110*67e74705SXin Li }
111