conversion-function.cpp revision d7d5f0223bd30dfd618762349c6209dd1d5ea3e6
1// RUN: clang-cc -fsyntax-only -verify %s
2class X {
3public:
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
16operator int(); // expected-error{{conversion function must be a non-static member function}}
17
18operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
19
20typedef 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}} \
26  // expected-error{{conversion function cannot have any parameters}} \
27  // expected-error{{conversion function cannot be variadic}}
28  operator func_type(); // expected-error{{conversion function cannot convert to a function type}}
29  operator array_type(); // expected-error{{conversion function cannot convert to an array type}}
30};
31
32
33typedef int INT;
34typedef INT* INT_PTR;
35
36class Z {
37  operator int(); // expected-note {{previous declaration is here}}
38  operator int**(); // expected-note {{previous declaration is here}}
39
40  operator INT();  // expected-error{{conversion function cannot be redeclared}}
41  operator INT_PTR*(); // expected-error{{conversion function cannot be redeclared}}
42};
43
44
45class A { };
46
47class B : public A {
48public:
49  operator A&() const; // expected-warning{{conversion function converting 'class B' to its base class 'class A' will never be used}}
50  operator const void() const; // expected-warning{{conversion function converting 'class B' to 'void const' will never be used}}
51  operator const B(); // expected-warning{{conversion function converting 'class B' to itself will never be used}}
52};
53