1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li struct X {
3*67e74705SXin Li X();
4*67e74705SXin Li X(int);
5*67e74705SXin Li };
6*67e74705SXin Li
7*67e74705SXin Li X operator+(X, X);
operator -(X,X)8*67e74705SXin Li X operator-(X, X) { X x; return x; }
9*67e74705SXin Li
10*67e74705SXin Li struct Y {
11*67e74705SXin Li Y operator-() const;
12*67e74705SXin Li void operator()(int x = 17) const;
13*67e74705SXin Li int operator[](int);
14*67e74705SXin Li
15*67e74705SXin Li static int operator+(Y, Y); // expected-error{{overloaded 'operator+' cannot be a static member function}}
16*67e74705SXin Li };
17*67e74705SXin Li
18*67e74705SXin Li
f(X x)19*67e74705SXin Li void f(X x) {
20*67e74705SXin Li x = operator+(x, x);
21*67e74705SXin Li }
22*67e74705SXin Li
23*67e74705SXin Li X operator+(int, float); // expected-error{{overloaded 'operator+' must have at least one parameter of class or enumeration type}}
24*67e74705SXin Li
25*67e74705SXin Li X operator*(X, X = 5); // expected-error{{parameter of overloaded 'operator*' cannot have a default argument}}
26*67e74705SXin Li
27*67e74705SXin Li X operator/(X, X, ...); // expected-error{{overloaded 'operator/' cannot be variadic}}
28*67e74705SXin Li
29*67e74705SXin Li X operator%(Y); // expected-error{{overloaded 'operator%' must be a binary operator (has 1 parameter)}}
30*67e74705SXin Li
31*67e74705SXin Li void operator()(Y&, int, int); // expected-error{{overloaded 'operator()' must be a non-static member function}}
32*67e74705SXin Li
33*67e74705SXin Li typedef int INT;
34*67e74705SXin Li typedef float FLOAT;
35*67e74705SXin Li Y& operator++(Y&);
36*67e74705SXin Li Y operator++(Y&, INT);
37*67e74705SXin Li X operator++(X&, FLOAT); // expected-error{{parameter of overloaded post-increment operator must have type 'int' (not 'FLOAT' (aka 'float'))}}
38*67e74705SXin Li
39*67e74705SXin Li int operator+; // expected-error{{'operator+' cannot be the name of a variable or data member}}
40*67e74705SXin Li
41*67e74705SXin Li namespace PR6238 {
42*67e74705SXin Li static struct {
43*67e74705SXin Li void operator()();
44*67e74705SXin Li } plus;
45*67e74705SXin Li }
46*67e74705SXin Li
47*67e74705SXin Li struct PR10839 {
48*67e74705SXin Li operator int; // expected-error{{'operator int' cannot be the name of a variable or data member}}
49*67e74705SXin Li int operator+; // expected-error{{'operator+' cannot be the name of a variable or data member}}
50*67e74705SXin Li };
51*67e74705SXin Li
52*67e74705SXin Li namespace PR14120 {
53*67e74705SXin Li struct A {
operator ()PR14120::A54*67e74705SXin Li static void operator()(int& i) { ++i; } // expected-error{{overloaded 'operator()' cannot be a static member function}}
55*67e74705SXin Li };
f()56*67e74705SXin Li void f() {
57*67e74705SXin Li int i = 0;
58*67e74705SXin Li A()(i);
59*67e74705SXin Li }
60*67e74705SXin Li }
61