blob: 798582c149cf894818b98a216050f7c792d9dd43 [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Sebastian Redl8593c782009-05-21 11:50:50 +00002struct A {
3};
4
5struct ConvertibleToA {
6 operator A();
7};
8
9struct ConvertibleToConstA {
10 operator const A();
11};
12
13struct B {
Douglas Gregor33074752009-09-30 21:46:01 +000014 B& operator=(B&); // expected-note 4 {{candidate function}}
Sebastian Redl8593c782009-05-21 11:50:50 +000015};
16
17struct ConvertibleToB {
18 operator B();
19};
20
21struct ConvertibleToBref {
22 operator B&();
23};
24
25struct ConvertibleToConstB {
26 operator const B();
27};
28
29struct ConvertibleToConstBref {
30 operator const B&();
31};
32
33struct C {
34 int operator=(int); // expected-note{{candidate function}}
35 long operator=(long); // expected-note{{candidate function}}
36 int operator+=(int); // expected-note{{candidate function}}
37 int operator+=(long); // expected-note{{candidate function}}
38};
39
40struct D {
41 D& operator+=(const D &);
42};
43
44struct ConvertibleToInt {
45 operator int();
46};
47
48void test() {
49 A a, na;
Douglas Gregor9db7dbb2010-01-31 09:12:51 +000050 const A constA = A();
Sebastian Redl8593c782009-05-21 11:50:50 +000051 ConvertibleToA convertibleToA;
52 ConvertibleToConstA convertibleToConstA;
53
54 B b, nb;
Douglas Gregor9db7dbb2010-01-31 09:12:51 +000055 const B constB = B();
Sebastian Redl8593c782009-05-21 11:50:50 +000056 ConvertibleToB convertibleToB;
57 ConvertibleToBref convertibleToBref;
58 ConvertibleToConstB convertibleToConstB;
59 ConvertibleToConstBref convertibleToConstBref;
60
61 C c, nc;
Douglas Gregor9db7dbb2010-01-31 09:12:51 +000062 const C constC = C();
Sebastian Redl8593c782009-05-21 11:50:50 +000063
64 D d, nd;
Douglas Gregor9db7dbb2010-01-31 09:12:51 +000065 const D constD = D();
Sebastian Redl8593c782009-05-21 11:50:50 +000066
67 ConvertibleToInt convertibleToInt;
68
69 na = a;
70 na = constA;
71 na = convertibleToA;
72 na = convertibleToConstA;
73 na += a; // expected-error{{no viable overloaded '+='}}
74
75 nb = b;
76 nb = constB; // expected-error{{no viable overloaded '='}}
77 nb = convertibleToB; // expected-error{{no viable overloaded '='}}
78 nb = convertibleToBref;
79 nb = convertibleToConstB; // expected-error{{no viable overloaded '='}}
80 nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}}
81
82 nc = c;
83 nc = constC;
84 nc = 1;
85 nc = 1L;
86 nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}}
87 nc += 1;
88 nc += 1L;
89 nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}}
90
91 nd = d;
92 nd += d;
93 nd += constD;
94
95 int i;
96 i = convertibleToInt;
Douglas Gregord4eea832010-04-09 00:35:39 +000097 i = a; // expected-error{{assigning to 'int' from incompatible type 'A'}}
Sebastian Redl8593c782009-05-21 11:50:50 +000098}
99
John McCall2d7d2d92010-08-16 23:42:35 +0000100// <rdar://problem/8315440>: Don't crash
Richard Trieu31fd2b72011-07-01 20:54:02 +0000101namespace test1 {
102 template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}}
Richard Smith412e0cc2012-03-27 00:56:56 +0000103 A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}}
John McCall2d7d2d92010-08-16 23:42:35 +0000104 };
Richard Trieu31fd2b72011-07-01 20:54:02 +0000105 template<typename T> class B : public A<T> {
John McCall2d7d2d92010-08-16 23:42:35 +0000106 virtual void foo() {}
107 };
Richard Smith412e0cc2012-03-27 00:56:56 +0000108 extern template class A<char>;
Richard Trieu31fd2b72011-07-01 20:54:02 +0000109 extern template class B<char>;
110}