blob: 1ca1e689eab0833259856c0ef6f079893cec447e [file] [log] [blame]
Daniel Dunbard7d5f022009-03-24 02:24:46 +00001// RUN: clang-cc -fsyntax-only -verify %s
Douglas Gregor2f1bc522008-11-07 20:08:42 +00002class X {
3public:
4 operator bool();
5 operator int() const;
Douglas Gregor2def4832008-11-17 20:34:05 +00006
7 bool f() {
8 return operator bool();
9 }
10
11 float g() {
Douglas Gregor17330012009-02-04 15:01:18 +000012 return operator float(); // expected-error{{no matching function for call to 'operator float'}}
Douglas Gregor2def4832008-11-17 20:34:05 +000013 }
Douglas Gregor2f1bc522008-11-07 20:08:42 +000014};
15
16operator int(); // expected-error{{conversion function must be a non-static member function}}
17
Douglas Gregor10bd3682008-11-17 22:58:34 +000018operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
19
Douglas Gregor2f1bc522008-11-07 20:08:42 +000020typedef int func_type(int);
21typedef int array_type[10];
22
23class Y {
24public:
25 void operator bool(int, ...) const; // expected-error{{conversion function cannot have a return type}} \
Chris Lattner6e475012009-04-25 08:35:12 +000026 // expected-error{{conversion function cannot have any parameters}}
27
28 operator float(...) const; // expected-error{{conversion function cannot be variadic}}
29
30
Douglas Gregor2f1bc522008-11-07 20:08:42 +000031 operator func_type(); // expected-error{{conversion function cannot convert to a function type}}
32 operator array_type(); // expected-error{{conversion function cannot convert to an array type}}
33};
34
35
36typedef int INT;
37typedef INT* INT_PTR;
38
39class Z {
Chris Lattner5f4a6822008-11-23 23:12:31 +000040 operator int(); // expected-note {{previous declaration is here}}
41 operator int**(); // expected-note {{previous declaration is here}}
Douglas Gregor2f1bc522008-11-07 20:08:42 +000042
43 operator INT(); // expected-error{{conversion function cannot be redeclared}}
44 operator INT_PTR*(); // expected-error{{conversion function cannot be redeclared}}
45};
46
47
48class A { };
49
50class B : public A {
51public:
52 operator A&() const; // expected-warning{{conversion function converting 'class B' to its base class 'class A' will never be used}}
53 operator const void() const; // expected-warning{{conversion function converting 'class B' to 'void const' will never be used}}
54 operator const B(); // expected-warning{{conversion function converting 'class B' to itself will never be used}}
55};
Sebastian Redl3201f6b2009-04-16 17:51:27 +000056
57// This used to crash Clang.
58struct Flip;
59struct Flop {
60 Flop();
61 Flop(const Flip&);
62};
63struct Flip {
64 operator Flop() const;
65};
66Flop flop = Flip(); // expected-error {{cannot initialize 'flop' with an rvalue of type 'struct Flip'}}