operators.def revision 117395
190075Sobrien/* -*-C-*-
290075Sobrien	
390075Sobrien   This file contains definitions of the various C++ operators,
490075Sobrien   including both overloadable operators (like `+') and
590075Sobrien   non-overloadable operators (like the `?:' ternary operator).  
690075Sobrien   Writtey by Mark Mitchell <mark@codesourcery.com>
790075Sobrien
8117395Skan   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
990075Sobrien
1090075SobrienThis file is part of GNU CC.
1190075Sobrien
1290075SobrienGNU CC is free software; you can redistribute it and/or modify
1390075Sobrienit under the terms of the GNU General Public License as published by
1490075Sobrienthe Free Software Foundation; either version 2, or (at your option)
1590075Sobrienany later version.
1690075Sobrien
1790075SobrienGNU CC is distributed in the hope that it will be useful,
1890075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1990075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2090075SobrienGNU General Public License for more details.
2190075Sobrien
2290075SobrienYou should have received a copy of the GNU General Public License
2390075Sobrienalong with GNU CC; see the file COPYING.  If not, write to
2490075Sobrienthe Free Software Foundation, 59 Temple Place - Suite 330,
2590075SobrienBoston, MA 02111-1307, USA.  */
2690075Sobrien
2790075Sobrien/* The DEF_OPERATOR macro takes the following arguments:
2890075Sobrien
2990075Sobrien   NAME
3090075Sobrien
3190075Sobrien     The name of the operator, as a C string, but without the
3290075Sobrien     preceding `operator'.  This is the name that would be given in
3390075Sobrien     the source program.  For `operator +', for example, this would be
3490075Sobrien     `+'.
3590075Sobrien   
3690075Sobrien   CODE
3790075Sobrien
3890075Sobrien     The tree_code for this operator.  For `operator +', for example,
3990075Sobrien     this would be PLUS_EXPR.  Because there are no tree codes for
4090075Sobrien     assignment operators, the same tree-codes are reused; i.e.,
4190075Sobrien     `operator +' will also have PLUS_EXPR as its CODE.
4290075Sobrien
43110611Skan   MANGLING
4490075Sobrien
4590075Sobrien     The mangling prefix for the operator, as a C string, and as
4690075Sobrien     mangled under the new ABI.  For `operator +', for example, this
4790075Sobrien     would be "pl".
4890075Sobrien
4990075Sobrien   ARITY
5090075Sobrien   
5190075Sobrien     The arity of the operator, or -1 if any arity is allowed.  (As
5290075Sobrien     for `operator ()'.)  Postincrement and postdecrement operators
5390075Sobrien     are marked as binary.
5490075Sobrien
5590075Sobrien   ASSN_P
5690075Sobrien
57117395Skan     A boolean value.  If nonzero, this is an assignment operator.
5890075Sobrien
5990075Sobrien   Before including this file, you should define DEFOPERATOR
6090075Sobrien   to take these arguments.  
6190075Sobrien
6290075Sobrien   There is code (such as in grok_op_properties) that depends on the
6390075Sobrien   order the operators are presented in this file.  In particular,
6490075Sobrien   unary operators must precede binary operators.  */
6590075Sobrien 
6690075Sobrien/* Use DEF_SIMPLE_OPERATOR to define a non-assignment operator.  Its
6790075Sobrien   arguments are as for DEF_OPERATOR, but there is no need to provide
6890075Sobrien   an ASSIGNMENT_P argument; it is always zero.  */
6990075Sobrien
7090075Sobrien#define DEF_SIMPLE_OPERATOR(NAME, CODE, MANGLING, ARITY) \
7190075Sobrien  DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 0)
7290075Sobrien
7390075Sobrien/* Use DEF_ASSN_OPERATOR to define an assignment operator.  Its
7490075Sobrien   arguments are as for DEF_OPERATOR, but there is no need to provide
7590075Sobrien   an ASSIGNMENT_P argument; it is always one.  */
7690075Sobrien
7790075Sobrien#define DEF_ASSN_OPERATOR(NAME, CODE, MANGLING, ARITY) \
7890075Sobrien  DEF_OPERATOR(NAME, CODE, MANGLING, ARITY, 1)
7990075Sobrien
8090075Sobrien/* Memory allocation operators.  */
8190075SobrienDEF_SIMPLE_OPERATOR ("new", NEW_EXPR, "nw", -1)
8290075SobrienDEF_SIMPLE_OPERATOR ("new []", VEC_NEW_EXPR, "na", -1)
8390075SobrienDEF_SIMPLE_OPERATOR ("delete", DELETE_EXPR, "dl", -1)
8490075SobrienDEF_SIMPLE_OPERATOR ("delete []", VEC_DELETE_EXPR, "da", -1)
8590075Sobrien
8690075Sobrien/* Unary operators.  */
8790075SobrienDEF_SIMPLE_OPERATOR ("+", CONVERT_EXPR, "ps", 1)
8890075SobrienDEF_SIMPLE_OPERATOR ("-", NEGATE_EXPR, "ng", 1)
8990075SobrienDEF_SIMPLE_OPERATOR ("&", ADDR_EXPR, "ad", 1)
9090075SobrienDEF_SIMPLE_OPERATOR ("*", INDIRECT_REF, "de", 1)
9190075SobrienDEF_SIMPLE_OPERATOR ("~", BIT_NOT_EXPR, "co", 1)
9290075SobrienDEF_SIMPLE_OPERATOR ("!", TRUTH_NOT_EXPR, "nt", 1)
9390075SobrienDEF_SIMPLE_OPERATOR ("++", PREINCREMENT_EXPR, "pp", 1)
9490075SobrienDEF_SIMPLE_OPERATOR ("--", PREDECREMENT_EXPR, "mm", 1)
9590075SobrienDEF_SIMPLE_OPERATOR ("sizeof", SIZEOF_EXPR, "sz", 1)
9690075Sobrien/* This is an extension.  */
9790075SobrienDEF_SIMPLE_OPERATOR ("alignof", ALIGNOF_EXPR, "v17alignof", 1)
9890075Sobrien
9990075Sobrien/* The cast operator.  */
10090075SobrienDEF_SIMPLE_OPERATOR ("", TYPE_EXPR, "cv", 1)
10190075SobrienDEF_SIMPLE_OPERATOR ("", CAST_EXPR, "cv", 1)
10290075SobrienDEF_SIMPLE_OPERATOR ("", CONST_CAST_EXPR, "cv", 1)
10390075SobrienDEF_SIMPLE_OPERATOR ("", STATIC_CAST_EXPR, "cv", 1)
10490075Sobrien
10590075Sobrien/* Binary operators.  */
10690075SobrienDEF_SIMPLE_OPERATOR ("+", PLUS_EXPR, "pl", 2)
10790075SobrienDEF_SIMPLE_OPERATOR ("-", MINUS_EXPR, "mi", 2)
10890075SobrienDEF_SIMPLE_OPERATOR ("*", MULT_EXPR, "ml", 2)
10990075SobrienDEF_SIMPLE_OPERATOR ("/", TRUNC_DIV_EXPR, "dv", 2)
11090075SobrienDEF_SIMPLE_OPERATOR ("%", TRUNC_MOD_EXPR, "rm", 2)
11190075SobrienDEF_SIMPLE_OPERATOR ("&", BIT_AND_EXPR, "an", 2)
11290075SobrienDEF_SIMPLE_OPERATOR ("|", BIT_IOR_EXPR, "or", 2)
11390075SobrienDEF_SIMPLE_OPERATOR ("^", BIT_XOR_EXPR, "eo", 2)
11490075SobrienDEF_SIMPLE_OPERATOR ("<<", LSHIFT_EXPR, "ls", 2)
11590075SobrienDEF_SIMPLE_OPERATOR (">>", RSHIFT_EXPR, "rs", 2)
11690075SobrienDEF_SIMPLE_OPERATOR ("==", EQ_EXPR, "eq", 2)
11790075SobrienDEF_SIMPLE_OPERATOR ("!=", NE_EXPR, "ne", 2)
11890075SobrienDEF_SIMPLE_OPERATOR ("<", LT_EXPR, "lt", 2)
11990075SobrienDEF_SIMPLE_OPERATOR (">", GT_EXPR, "gt", 2)
12090075SobrienDEF_SIMPLE_OPERATOR ("<=", LE_EXPR, "le", 2)
12190075SobrienDEF_SIMPLE_OPERATOR (">=", GE_EXPR, "ge", 2)
12290075SobrienDEF_SIMPLE_OPERATOR ("&&", TRUTH_ANDIF_EXPR, "aa", 2)
12390075SobrienDEF_SIMPLE_OPERATOR ("||", TRUTH_ORIF_EXPR, "oo", 2)
12490075SobrienDEF_SIMPLE_OPERATOR (",", COMPOUND_EXPR, "cm", 2)
12590075SobrienDEF_SIMPLE_OPERATOR ("->*", MEMBER_REF, "pm", 2)
12690075SobrienDEF_SIMPLE_OPERATOR ("->", COMPONENT_REF, "pt", 2)
12790075SobrienDEF_SIMPLE_OPERATOR ("[]", ARRAY_REF, "ix", 2)
12890075SobrienDEF_SIMPLE_OPERATOR ("++", POSTINCREMENT_EXPR, "pp", 2)
12990075SobrienDEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2)
130110611Skan/* These operators are GNU extensions.  */
13190075SobrienDEF_SIMPLE_OPERATOR ("<?", MIN_EXPR, "v23min", 2)
13290075SobrienDEF_SIMPLE_OPERATOR (">?", MAX_EXPR, "v23max", 2)
13390075Sobrien/* This one is needed for mangling.  */
13490075SobrienDEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2);
13590075Sobrien
13690075Sobrien/* Assignment operators.  */
13790075SobrienDEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", 2)
13890075SobrienDEF_ASSN_OPERATOR ("+=", PLUS_EXPR, "pL", 2)
13990075SobrienDEF_ASSN_OPERATOR ("-=", MINUS_EXPR, "mI", 2)
14090075SobrienDEF_ASSN_OPERATOR ("*=", MULT_EXPR, "mL", 2)
14190075SobrienDEF_ASSN_OPERATOR ("/=", TRUNC_DIV_EXPR, "dV", 2)
14290075SobrienDEF_ASSN_OPERATOR ("%=", TRUNC_MOD_EXPR, "rM", 2)
14390075SobrienDEF_ASSN_OPERATOR ("&=", BIT_AND_EXPR, "aN", 2)
14490075SobrienDEF_ASSN_OPERATOR ("|=", BIT_IOR_EXPR, "oR", 2)
14590075SobrienDEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", 2)
14690075SobrienDEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", 2)
14790075SobrienDEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", 2)
148110611Skan/* These operators are GNU extensions.  */
149110611SkanDEF_ASSN_OPERATOR ("<?=", MIN_EXPR, "v23miN", 2);
150110611SkanDEF_ASSN_OPERATOR (">?=", MAX_EXPR, "v23maX", 2);
15190075Sobrien
15290075Sobrien/* Ternary operators.  */
15390075SobrienDEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3)
15490075Sobrien
15590075Sobrien/* Miscellaneous.  */
15690075SobrienDEF_SIMPLE_OPERATOR ("()", CALL_EXPR, "cl", -1)
157