xref: /aosp_15_r20/external/clang/test/SemaCXX/overloaded-operator-decl.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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