1 | /* -*-C-*- |
2 | |
3 | This file contains definitions of the various C++ operators, |
4 | including both overloadable operators (like `+') and |
5 | non-overloadable operators (like the `?:' ternary operator). |
6 | Written by Mark Mitchell <mark@codesourcery.com> |
7 | |
8 | Copyright (C) 2000-2023 Free Software Foundation, Inc. |
9 | |
10 | This file is part of GCC. |
11 | |
12 | GCC is free software; you can redistribute it and/or modify |
13 | it under the terms of the GNU General Public License as published by |
14 | the Free Software Foundation; either version 3, or (at your option) |
15 | any later version. |
16 | |
17 | GCC is distributed in the hope that it will be useful, |
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
20 | GNU General Public License for more details. |
21 | |
22 | You should have received a copy of the GNU General Public License |
23 | along with GCC; see the file COPYING3. If not see |
24 | <http://www.gnu.org/licenses/>. */ |
25 | |
26 | /* The DEF_OPERATOR macro takes the following arguments: |
27 | |
28 | NAME |
29 | |
30 | The name of the operator, as a C string, but without the |
31 | preceding `operator'. This is the name that would be given in |
32 | the source program. For `operator +', for example, this would be |
33 | `+'. |
34 | |
35 | CODE |
36 | |
37 | The tree_code for this operator. For `operator +', for example, |
38 | this would be PLUS_EXPR. Because there are no tree codes for |
39 | assignment operators, the same tree-codes are reused; i.e., |
40 | `operator +' will also have PLUS_EXPR as its CODE. |
41 | |
42 | MANGLING |
43 | |
44 | The mangling prefix for the operator, as a C string, and as |
45 | mangled under the new ABI. For `operator +', for example, this |
46 | would be "pl". |
47 | |
48 | FLAGS |
49 | |
50 | ovl_op_flags bits. Postincrement and postdecrement operators are |
51 | marked as binary. |
52 | |
53 | Before including this file, you should define DEF_OPERATOR |
54 | to take these arguments. |
55 | |
56 | There is code (such as in grok_op_properties) that depends on the |
57 | order the operators are presented in this file. Unary_ops must |
58 | preceed a matching binary op (i.e. '+'). Assignment operators must |
59 | be last, after OPERATOR_TRANSITION. */ |
60 | |
61 | /* Use DEF_ASSN_OPERATOR to define an assignment operator. Its |
62 | arguments are as for DEF_OPERATOR, but there is no need to provide |
63 | FLAGS (OVL_OP_FLAG_BINARY). */ |
64 | |
65 | #ifndef DEF_ASSN_OPERATOR |
66 | #define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING) \ |
67 | DEF_OPERATOR(NAME, CODE, MANGLING, OVL_OP_FLAG_BINARY) |
68 | #endif |
69 | |
70 | /* Memory allocation operators. ARITY has special meaning. */ |
71 | DEF_OPERATOR ("new" , NEW_EXPR, "nw" , OVL_OP_FLAG_ALLOC) |
72 | DEF_OPERATOR ("new []" , VEC_NEW_EXPR, "na" , |
73 | OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_VEC) |
74 | DEF_OPERATOR ("delete" , DELETE_EXPR, "dl" , |
75 | OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE) |
76 | DEF_OPERATOR ("delete []" , VEC_DELETE_EXPR, "da" , |
77 | OVL_OP_FLAG_ALLOC | OVL_OP_FLAG_DELETE | OVL_OP_FLAG_VEC) |
78 | |
79 | /* Unary operators. */ |
80 | DEF_OPERATOR ("+" , UNARY_PLUS_EXPR, "ps" , OVL_OP_FLAG_UNARY) |
81 | DEF_OPERATOR ("-" , NEGATE_EXPR, "ng" , OVL_OP_FLAG_UNARY) |
82 | DEF_OPERATOR ("&" , ADDR_EXPR, "ad" , OVL_OP_FLAG_UNARY) |
83 | DEF_OPERATOR ("*" , INDIRECT_REF, "de" , OVL_OP_FLAG_UNARY) |
84 | DEF_OPERATOR ("~" , BIT_NOT_EXPR, "co" , OVL_OP_FLAG_UNARY) |
85 | DEF_OPERATOR ("!" , TRUTH_NOT_EXPR, "nt" , OVL_OP_FLAG_UNARY) |
86 | DEF_OPERATOR ("++" , PREINCREMENT_EXPR, "pp" , OVL_OP_FLAG_UNARY) |
87 | DEF_OPERATOR ("--" , PREDECREMENT_EXPR, "mm" , OVL_OP_FLAG_UNARY) |
88 | DEF_OPERATOR ("->" , COMPONENT_REF, "pt" , OVL_OP_FLAG_UNARY) |
89 | DEF_OPERATOR ("sizeof" , SIZEOF_EXPR, "sz" , OVL_OP_FLAG_UNARY) |
90 | DEF_OPERATOR ("co_await" , CO_AWAIT_EXPR, "aw" , OVL_OP_FLAG_UNARY) |
91 | |
92 | /* These are extensions. */ |
93 | DEF_OPERATOR ("alignof" , ALIGNOF_EXPR, "az" , OVL_OP_FLAG_UNARY) |
94 | DEF_OPERATOR ("__imag__" , IMAGPART_EXPR, "v18__imag__" , OVL_OP_FLAG_UNARY) |
95 | DEF_OPERATOR ("__real__" , REALPART_EXPR, "v18__real__" , OVL_OP_FLAG_UNARY) |
96 | |
97 | /* Binary operators. */ |
98 | DEF_OPERATOR ("+" , PLUS_EXPR, "pl" , OVL_OP_FLAG_BINARY) |
99 | DEF_OPERATOR ("-" , MINUS_EXPR, "mi" , OVL_OP_FLAG_BINARY) |
100 | DEF_OPERATOR ("*" , MULT_EXPR, "ml" , OVL_OP_FLAG_BINARY) |
101 | DEF_OPERATOR ("/" , TRUNC_DIV_EXPR, "dv" , OVL_OP_FLAG_BINARY) |
102 | DEF_OPERATOR ("%" , TRUNC_MOD_EXPR, "rm" , OVL_OP_FLAG_BINARY) |
103 | DEF_OPERATOR ("&" , BIT_AND_EXPR, "an" , OVL_OP_FLAG_BINARY) |
104 | DEF_OPERATOR ("|" , BIT_IOR_EXPR, "or" , OVL_OP_FLAG_BINARY) |
105 | DEF_OPERATOR ("^" , BIT_XOR_EXPR, "eo" , OVL_OP_FLAG_BINARY) |
106 | DEF_OPERATOR ("<<" , LSHIFT_EXPR, "ls" , OVL_OP_FLAG_BINARY) |
107 | DEF_OPERATOR (">>" , RSHIFT_EXPR, "rs" , OVL_OP_FLAG_BINARY) |
108 | |
109 | /* defaultable_fn_check relies on the ordering of the comparison operators. */ |
110 | DEF_OPERATOR ("==" , EQ_EXPR, "eq" , OVL_OP_FLAG_BINARY) |
111 | DEF_OPERATOR ("!=" , NE_EXPR, "ne" , OVL_OP_FLAG_BINARY) |
112 | DEF_OPERATOR ("<" , LT_EXPR, "lt" , OVL_OP_FLAG_BINARY) |
113 | DEF_OPERATOR (">" , GT_EXPR, "gt" , OVL_OP_FLAG_BINARY) |
114 | DEF_OPERATOR ("<=" , LE_EXPR, "le" , OVL_OP_FLAG_BINARY) |
115 | DEF_OPERATOR (">=" , GE_EXPR, "ge" , OVL_OP_FLAG_BINARY) |
116 | DEF_OPERATOR ("<=>" , SPACESHIP_EXPR, "ss" , OVL_OP_FLAG_BINARY) |
117 | |
118 | DEF_OPERATOR ("&&" , TRUTH_ANDIF_EXPR, "aa" , OVL_OP_FLAG_BINARY) |
119 | DEF_OPERATOR ("||" , TRUTH_ORIF_EXPR, "oo" , OVL_OP_FLAG_BINARY) |
120 | DEF_OPERATOR ("," , COMPOUND_EXPR, "cm" , OVL_OP_FLAG_BINARY) |
121 | DEF_OPERATOR ("->*" , MEMBER_REF, "pm" , OVL_OP_FLAG_BINARY) |
122 | DEF_OPERATOR (".*" , DOTSTAR_EXPR, "ds" , OVL_OP_FLAG_BINARY) |
123 | DEF_OPERATOR ("[]" , ARRAY_REF, "ix" , OVL_OP_FLAG_BINARY) |
124 | DEF_OPERATOR ("++" , POSTINCREMENT_EXPR, "pp" , OVL_OP_FLAG_BINARY) |
125 | DEF_OPERATOR ("--" , POSTDECREMENT_EXPR, "mm" , OVL_OP_FLAG_BINARY) |
126 | |
127 | /* Miscellaneous. */ |
128 | DEF_OPERATOR ("?:" , COND_EXPR, "qu" , OVL_OP_FLAG_NONE) |
129 | DEF_OPERATOR ("()" , CALL_EXPR, "cl" , OVL_OP_FLAG_NONE) |
130 | |
131 | /* Operators needed for mangling. */ |
132 | DEF_OPERATOR (NULL, CAST_EXPR, "cv" , OVL_OP_FLAG_UNARY) |
133 | DEF_OPERATOR (NULL, DYNAMIC_CAST_EXPR, "dc" , OVL_OP_FLAG_UNARY) |
134 | DEF_OPERATOR (NULL, REINTERPRET_CAST_EXPR, "rc" , OVL_OP_FLAG_UNARY) |
135 | DEF_OPERATOR (NULL, CONST_CAST_EXPR, "cc" , OVL_OP_FLAG_UNARY) |
136 | DEF_OPERATOR (NULL, STATIC_CAST_EXPR, "sc" , OVL_OP_FLAG_UNARY) |
137 | DEF_OPERATOR (NULL, SCOPE_REF, "sr" , OVL_OP_FLAG_NONE) |
138 | DEF_OPERATOR (NULL, EXPR_PACK_EXPANSION, "sp" , OVL_OP_FLAG_NONE) |
139 | DEF_OPERATOR (NULL, UNARY_LEFT_FOLD_EXPR, "fl" , OVL_OP_FLAG_NONE) |
140 | DEF_OPERATOR (NULL, UNARY_RIGHT_FOLD_EXPR, "fr" , OVL_OP_FLAG_NONE) |
141 | DEF_OPERATOR (NULL, BINARY_LEFT_FOLD_EXPR, "fL" , OVL_OP_FLAG_NONE) |
142 | DEF_OPERATOR (NULL, BINARY_RIGHT_FOLD_EXPR, "fR" , OVL_OP_FLAG_NONE) |
143 | |
144 | #ifdef OPERATOR_TRANSITION |
145 | OPERATOR_TRANSITION |
146 | #undef OPERATOR_TRANSITION |
147 | #endif |
148 | |
149 | /* Assignment operators. */ |
150 | DEF_ASSN_OPERATOR ("=" , NOP_EXPR, "aS" ) |
151 | DEF_ASSN_OPERATOR ("+=" , PLUS_EXPR, "pL" ) |
152 | DEF_ASSN_OPERATOR ("-=" , MINUS_EXPR, "mI" ) |
153 | DEF_ASSN_OPERATOR ("*=" , MULT_EXPR, "mL" ) |
154 | DEF_ASSN_OPERATOR ("/=" , TRUNC_DIV_EXPR, "dV" ) |
155 | DEF_ASSN_OPERATOR ("%=" , TRUNC_MOD_EXPR, "rM" ) |
156 | DEF_ASSN_OPERATOR ("&=" , BIT_AND_EXPR, "aN" ) |
157 | DEF_ASSN_OPERATOR ("|=" , BIT_IOR_EXPR, "oR" ) |
158 | DEF_ASSN_OPERATOR ("^=" , BIT_XOR_EXPR, "eO" ) |
159 | DEF_ASSN_OPERATOR ("<<=" , LSHIFT_EXPR, "lS" ) |
160 | DEF_ASSN_OPERATOR (">>=" , RSHIFT_EXPR, "rS" ) |
161 | |
162 | #undef DEF_ASSN_OPERATOR |
163 | #undef DEF_OPERATOR |
164 | |