1 // RUN: clang-cc -fsyntax-only -verify %s
2 class X {
3 public:
4   operator bool();
5   operator int() const;
6 
7   bool f() {
8     return operator bool();
9   }
10 
11   float g() {
12     return operator float(); // expected-error{{no matching function for call to 'operator float'}}
13   }
14 };
15 
16 operator int(); // expected-error{{conversion function must be a non-static member function}}
17 
18 operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
19 
20 typedef int func_type(int);
21 typedef int array_type[10];
22 
23 class Y {
24 public:
25   void operator bool(int, ...) const; // expected-error{{conversion function cannot have a return type}} \
26   // expected-error{{conversion function cannot have any parameters}}
27 
28   operator float(...) const;  // expected-error{{conversion function cannot be variadic}}
29 
30 
31   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 
36 typedef int INT;
37 typedef INT* INT_PTR;
38 
39 class Z {
40   operator int(); // expected-note {{previous declaration is here}}
41   operator int**(); // expected-note {{previous declaration is here}}
42 
43   operator INT();  // expected-error{{conversion function cannot be redeclared}}
44   operator INT_PTR*(); // expected-error{{conversion function cannot be redeclared}}
45 };
46 
47 
48 class A { };
49 
50 class B : public A {
51 public:
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 };
56 
57 // This used to crash Clang.
58 struct Flip;
59 struct Flop {
60   Flop();
61   Flop(const Flip&);
62 };
63 struct Flip {
64   operator Flop() const;
65 };
66 Flop flop = Flip(); // expected-error {{cannot initialize 'flop' with an rvalue of type 'struct Flip'}}
67