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, 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
9
10This file is part of GCC.
11
12GCC is free software; you can redistribute it and/or modify
13it under the terms of the GNU General Public License as published by
14the Free Software Foundation; either version 2, or (at your option)
15any later version.
16
17GCC is distributed in the hope that it will be useful,
18but WITHOUT ANY WARRANTY; without even the implied warranty of
19MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20GNU General Public License for more details.
21
22You should have received a copy of the GNU General Public License
23along with GCC; see the file COPYING.  If not, write to
24the Free Software Foundation, 51 Franklin Street, Fifth Floor,
25Boston, MA 02110-1301, USA.  */
26
27/* The DEF_OPERATOR macro takes the following arguments:
28
29   NAME
30
31     The name of the operator, as a C string, but without the
32     preceding `operator'.  This is the name that would be given in
33     the source program.  For `operator +', for example, this would be
34     `+'.
35
36   CODE
37
38     The tree_code for this operator.  For `operator +', for example,
39     this would be PLUS_EXPR.  Because there are no tree codes for
40     assignment operators, the same tree-codes are reused; i.e.,
41     `operator +' will also have PLUS_EXPR as its CODE.
42
43   MANGLING
44
45     The mangling prefix for the operator, as a C string, and as
46     mangled under the new ABI.  For `operator +', for example, this
47     would be "pl".
48
49   ARITY
50
51     The arity of the operator, or -1 if any arity is allowed.  (As
52     for `operator ()'.)  Postincrement and postdecrement operators
53     are marked as binary.
54
55   ASSN_P
56
57     A boolean value.  If nonzero, this is an assignment operator.
58
59   Before including this file, you should define DEFOPERATOR
60   to take these arguments.
61
62   There is code (such as in grok_op_properties) that depends on the
63   order the operators are presented in this file.  In particular,
64   unary operators must precede binary operators.  */
65
66/* Use DEF_SIMPLE_OPERATOR to define a non-assignment operator.  Its
67   arguments are as for DEF_OPERATOR, but there is no need to provide
68   an ASSIGNMENT_P argument; it is always zero.  */
69
70#define DEF_SIMPLE_OPERATOR(NAME, CODE, MANGLING, ARITY) \
71  DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 0)
72
73/* Use DEF_ASSN_OPERATOR to define an assignment operator.  Its
74   arguments are as for DEF_OPERATOR, but there is no need to provide
75   an ASSIGNMENT_P argument; it is always one.  */
76
77#define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING, ARITY) \
78  DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 1)
79
80/* Memory allocation operators.  */
81DEF_SIMPLE_OPERATOR ("new", NEW_EXPR, "nw", -1)
82DEF_SIMPLE_OPERATOR ("new []", VEC_NEW_EXPR, "na", -1)
83DEF_SIMPLE_OPERATOR ("delete", DELETE_EXPR, "dl", -1)
84DEF_SIMPLE_OPERATOR ("delete []", VEC_DELETE_EXPR, "da", -1)
85
86/* Unary operators.  */
87DEF_SIMPLE_OPERATOR ("+", UNARY_PLUS_EXPR, "ps", 1)
88DEF_SIMPLE_OPERATOR ("-", NEGATE_EXPR, "ng", 1)
89DEF_SIMPLE_OPERATOR ("&", ADDR_EXPR, "ad", 1)
90DEF_SIMPLE_OPERATOR ("*", INDIRECT_REF, "de", 1)
91DEF_SIMPLE_OPERATOR ("~", BIT_NOT_EXPR, "co", 1)
92DEF_SIMPLE_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", 1)
93DEF_SIMPLE_OPERATOR ("++", PREINCREMENT_EXPR, "pp", 1)
94DEF_SIMPLE_OPERATOR ("--", PREDECREMENT_EXPR, "mm", 1)
95DEF_SIMPLE_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", 1)
96/* These are extensions.  */
97DEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "v17alignof", 1)
98DEF_SIMPLE_OPERATOR ("__imag__", IMAGPART_EXPR, "v18__imag__", 1)
99DEF_SIMPLE_OPERATOR ("__real__", REALPART_EXPR, "v18__real__", 1)
100
101/* The cast operator.  */
102DEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", 1)
103DEF_SIMPLE_OPERATOR ("", CAST_EXPR, "cv", 1)
104DEF_SIMPLE_OPERATOR ("", CONST_CAST_EXPR, "cv", 1)
105DEF_SIMPLE_OPERATOR ("", STATIC_CAST_EXPR, "cv", 1)
106
107/* Binary operators.  */
108DEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", 2)
109DEF_SIMPLE_OPERATOR ("-", MINUS_EXPR, "mi", 2)
110DEF_SIMPLE_OPERATOR ("*", MULT_EXPR, "ml", 2)
111DEF_SIMPLE_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", 2)
112DEF_SIMPLE_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", 2)
113DEF_SIMPLE_OPERATOR ("&", BIT_AND_EXPR, "an", 2)
114DEF_SIMPLE_OPERATOR ("|", BIT_IOR_EXPR, "or", 2)
115DEF_SIMPLE_OPERATOR ("^", BIT_XOR_EXPR, "eo", 2)
116DEF_SIMPLE_OPERATOR ("<<", LSHIFT_EXPR, "ls", 2)
117DEF_SIMPLE_OPERATOR (">>", RSHIFT_EXPR, "rs", 2)
118DEF_SIMPLE_OPERATOR ("==", EQ_EXPR, "eq", 2)
119DEF_SIMPLE_OPERATOR ("!=", NE_EXPR, "ne", 2)
120DEF_SIMPLE_OPERATOR ("<", LT_EXPR, "lt", 2)
121DEF_SIMPLE_OPERATOR (">", GT_EXPR, "gt", 2)
122DEF_SIMPLE_OPERATOR ("<=", LE_EXPR, "le", 2)
123DEF_SIMPLE_OPERATOR (">=", GE_EXPR, "ge", 2)
124DEF_SIMPLE_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", 2)
125DEF_SIMPLE_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", 2)
126DEF_SIMPLE_OPERATOR (",", COMPOUND_EXPR, "cm", 2)
127DEF_SIMPLE_OPERATOR ("->*", MEMBER_REF, "pm", 2)
128DEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", 2)
129DEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", 2)
130DEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", 2)
131DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2)
132/* This one is needed for mangling.  */
133DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2)
134
135/* Assignment operators.  */
136DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", 2)
137DEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL", 2)
138DEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI", 2)
139DEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL", 2)
140DEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV", 2)
141DEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM", 2)
142DEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN", 2)
143DEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", 2)
144DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", 2)
145DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", 2)
146DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", 2)
147
148/* Ternary operators.  */
149DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3)
150
151/* Miscellaneous.  */
152DEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", -1)
153