1*06f32e7eSjoerg//===--- OperatorKinds.def - C++ Overloaded Operator Database ---*- C++ -*-===// 2*06f32e7eSjoerg// 3*06f32e7eSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06f32e7eSjoerg// See https://llvm.org/LICENSE.txt for license information. 5*06f32e7eSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06f32e7eSjoerg// 7*06f32e7eSjoerg//===----------------------------------------------------------------------===// 8*06f32e7eSjoerg// 9*06f32e7eSjoerg// This file defines the OverloadedOperator database, which includes 10*06f32e7eSjoerg// all of the overloadable C++ operators. 11*06f32e7eSjoerg// 12*06f32e7eSjoerg//===----------------------------------------------------------------------===// 13*06f32e7eSjoerg// 14*06f32e7eSjoerg/// @file OperatorKinds.def 15*06f32e7eSjoerg/// 16*06f32e7eSjoerg/// In this file, each of the overloadable C++ operators is enumerated 17*06f32e7eSjoerg/// with either the OVERLOADED_OPERATOR or OVERLOADED_OPERATOR_MULTI 18*06f32e7eSjoerg/// macro, each of which can be specified by the code including this 19*06f32e7eSjoerg/// file. OVERLOADED_OPERATOR is used for single-token operators 20*06f32e7eSjoerg/// (e.g., "+"), and has six arguments: 21*06f32e7eSjoerg/// 22*06f32e7eSjoerg/// Name: The name of the token. OO_Name will be the name of the 23*06f32e7eSjoerg/// corresponding enumerator in OverloadedOperatorKind in 24*06f32e7eSjoerg/// OperatorKinds.h. 25*06f32e7eSjoerg/// 26*06f32e7eSjoerg/// Spelling: A string that provides a canonical spelling for the 27*06f32e7eSjoerg/// operator, e.g., "operator+". 28*06f32e7eSjoerg/// 29*06f32e7eSjoerg/// Token: The name of the token that specifies the operator, e.g., 30*06f32e7eSjoerg/// "plus" for operator+ or "greatergreaterequal" for 31*06f32e7eSjoerg/// "operator>>=". With a "kw_" prefix, the token name can be used as 32*06f32e7eSjoerg/// an enumerator into the TokenKind enumeration. 33*06f32e7eSjoerg/// 34*06f32e7eSjoerg/// Unary: True if the operator can be declared as a unary operator. 35*06f32e7eSjoerg/// 36*06f32e7eSjoerg/// Binary: True if the operator can be declared as a binary 37*06f32e7eSjoerg/// operator. Note that some operators (e.g., "operator+" and 38*06f32e7eSjoerg/// "operator*") can be both unary and binary. 39*06f32e7eSjoerg/// 40*06f32e7eSjoerg/// MemberOnly: True if this operator can only be declared as a 41*06f32e7eSjoerg/// non-static member function. False if the operator can be both a 42*06f32e7eSjoerg/// non-member function and a non-static member function. 43*06f32e7eSjoerg/// 44*06f32e7eSjoerg/// OVERLOADED_OPERATOR_MULTI is used to enumerate the multi-token 45*06f32e7eSjoerg/// overloaded operator names, e.g., "operator delete []". The macro 46*06f32e7eSjoerg/// has all of the parameters of OVERLOADED_OPERATOR except Token, 47*06f32e7eSjoerg/// which is omitted. 48*06f32e7eSjoerg 49*06f32e7eSjoerg#ifndef OVERLOADED_OPERATOR 50*06f32e7eSjoerg# define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) 51*06f32e7eSjoerg#endif 52*06f32e7eSjoerg 53*06f32e7eSjoerg#ifndef OVERLOADED_OPERATOR_MULTI 54*06f32e7eSjoerg# define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) \ 55*06f32e7eSjoerg OVERLOADED_OPERATOR(Name,Spelling,unknown,Unary,Binary,MemberOnly) 56*06f32e7eSjoerg#endif 57*06f32e7eSjoerg 58*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(New , "new" , true , true , false) 59*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Delete , "delete" , true , true , false) 60*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Array_New , "new[]" , true , true , false) 61*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Array_Delete , "delete[]" , true , true , false) 62*06f32e7eSjoergOVERLOADED_OPERATOR(Plus , "+" , plus , true , true , false) 63*06f32e7eSjoergOVERLOADED_OPERATOR(Minus , "-" , minus , true , true , false) 64*06f32e7eSjoergOVERLOADED_OPERATOR(Star , "*" , star , true , true , false) 65*06f32e7eSjoergOVERLOADED_OPERATOR(Slash , "/" , slash , false, true , false) 66*06f32e7eSjoergOVERLOADED_OPERATOR(Percent , "%" , percent , false, true , false) 67*06f32e7eSjoergOVERLOADED_OPERATOR(Caret , "^" , caret , false, true , false) 68*06f32e7eSjoergOVERLOADED_OPERATOR(Amp , "&" , amp , true , true , false) 69*06f32e7eSjoergOVERLOADED_OPERATOR(Pipe , "|" , pipe , false, true , false) 70*06f32e7eSjoergOVERLOADED_OPERATOR(Tilde , "~" , tilde , true , false, false) 71*06f32e7eSjoergOVERLOADED_OPERATOR(Exclaim , "!" , exclaim , true , false, false) 72*06f32e7eSjoergOVERLOADED_OPERATOR(Equal , "=" , equal , false, true , true) 73*06f32e7eSjoergOVERLOADED_OPERATOR(Less , "<" , less , false, true , false) 74*06f32e7eSjoergOVERLOADED_OPERATOR(Greater , ">" , greater , false, true , false) 75*06f32e7eSjoergOVERLOADED_OPERATOR(PlusEqual , "+=" , plusequal , false, true , false) 76*06f32e7eSjoergOVERLOADED_OPERATOR(MinusEqual , "-=" , minusequal , false, true , false) 77*06f32e7eSjoergOVERLOADED_OPERATOR(StarEqual , "*=" , starequal , false, true , false) 78*06f32e7eSjoergOVERLOADED_OPERATOR(SlashEqual , "/=" , slashequal , false, true , false) 79*06f32e7eSjoergOVERLOADED_OPERATOR(PercentEqual , "%=" , percentequal , false, true , false) 80*06f32e7eSjoergOVERLOADED_OPERATOR(CaretEqual , "^=" , caretequal , false, true , false) 81*06f32e7eSjoergOVERLOADED_OPERATOR(AmpEqual , "&=" , ampequal , false, true , false) 82*06f32e7eSjoergOVERLOADED_OPERATOR(PipeEqual , "|=" , pipeequal , false, true , false) 83*06f32e7eSjoergOVERLOADED_OPERATOR(LessLess , "<<" , lessless , false, true , false) 84*06f32e7eSjoergOVERLOADED_OPERATOR(GreaterGreater , ">>" , greatergreater , false, true , false) 85*06f32e7eSjoergOVERLOADED_OPERATOR(LessLessEqual , "<<=" , lesslessequal , false, true , false) 86*06f32e7eSjoergOVERLOADED_OPERATOR(GreaterGreaterEqual , ">>=" , greatergreaterequal, false, true , false) 87*06f32e7eSjoergOVERLOADED_OPERATOR(EqualEqual , "==" , equalequal , false, true , false) 88*06f32e7eSjoergOVERLOADED_OPERATOR(ExclaimEqual , "!=" , exclaimequal , false, true , false) 89*06f32e7eSjoergOVERLOADED_OPERATOR(LessEqual , "<=" , lessequal , false, true , false) 90*06f32e7eSjoergOVERLOADED_OPERATOR(GreaterEqual , ">=" , greaterequal , false, true , false) 91*06f32e7eSjoergOVERLOADED_OPERATOR(Spaceship , "<=>" , spaceship , false, true , false) 92*06f32e7eSjoergOVERLOADED_OPERATOR(AmpAmp , "&&" , ampamp , false, true , false) 93*06f32e7eSjoergOVERLOADED_OPERATOR(PipePipe , "||" , pipepipe , false, true , false) 94*06f32e7eSjoergOVERLOADED_OPERATOR(PlusPlus , "++" , plusplus , true , true , false) 95*06f32e7eSjoergOVERLOADED_OPERATOR(MinusMinus , "--" , minusminus , true , true , false) 96*06f32e7eSjoergOVERLOADED_OPERATOR(Comma , "," , comma , false, true , false) 97*06f32e7eSjoergOVERLOADED_OPERATOR(ArrowStar , "->*" , arrowstar , false, true , false) 98*06f32e7eSjoergOVERLOADED_OPERATOR(Arrow , "->" , arrow , true , false, true) 99*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Call , "()" , true , true , true) 100*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Subscript , "[]" , false, true , true) 101*06f32e7eSjoerg// ?: can *not* be overloaded, but we need the overload 102*06f32e7eSjoerg// resolution machinery for it. 103*06f32e7eSjoergOVERLOADED_OPERATOR_MULTI(Conditional , "?" , false, true , false) 104*06f32e7eSjoergOVERLOADED_OPERATOR(Coawait , "co_await", kw_co_await , true , false, false) 105*06f32e7eSjoerg 106*06f32e7eSjoerg#undef OVERLOADED_OPERATOR_MULTI 107*06f32e7eSjoerg#undef OVERLOADED_OPERATOR 108